mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[DAGCombiner] Don't combine (addcarry (uaddo X, Y), 0, Carry) -> (addcarry X, Y, Carry) if the Carry comes from the uaddo.
Summary: The uaddo won't be removed and the addcarry will still be dependent on the uaddo. So we'll just increase the use count of X and Y and potentially require a COPY. Reviewers: spatel, RKSimon, deadalnix Reviewed By: RKSimon Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D64190 llvm-svn: 365149
This commit is contained in:
parent
dd229b271a
commit
20330a7c7f
@ -2966,8 +2966,11 @@ SDValue DAGCombiner::visitADDCARRYLike(SDValue N0, SDValue N1, SDValue CarryIn,
|
||||
SDNode *N) {
|
||||
// Iff the flag result is dead:
|
||||
// (addcarry (add|uaddo X, Y), 0, Carry) -> (addcarry X, Y, Carry)
|
||||
// Don't do this if the Carry comes from the uaddo. It won't remove the uaddo
|
||||
// or the dependency between the instructions.
|
||||
if ((N0.getOpcode() == ISD::ADD ||
|
||||
(N0.getOpcode() == ISD::UADDO && N0.getResNo() == 0)) &&
|
||||
(N0.getOpcode() == ISD::UADDO && N0.getResNo() == 0 &&
|
||||
N0.getValue(1) != CarryIn)) &&
|
||||
isNullConstant(N1) && !N->hasAnyUseOfValue(1))
|
||||
return DAG.getNode(ISD::ADDCARRY, SDLoc(N), N->getVTList(),
|
||||
N0.getOperand(0), N0.getOperand(1), CarryIn);
|
||||
|
@ -9,11 +9,9 @@
|
||||
define i32 @test1(i32 %sum, i32 %x) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test1:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; CHECK-NEXT: movl %eax, %edx
|
||||
; CHECK-NEXT: addl %ecx, %edx
|
||||
; CHECK-NEXT: adcl %ecx, %eax
|
||||
; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax
|
||||
; CHECK-NEXT: adcl $0, %eax
|
||||
; CHECK-NEXT: retl
|
||||
%add4 = add i32 %x, %sum
|
||||
%cmp = icmp ult i32 %add4, %x
|
||||
|
Loading…
Reference in New Issue
Block a user