diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3014,7 +3014,8 @@ return SDValue(); } -static SDValue getAsCarry(const TargetLowering &TLI, SDValue V) { +static SDValue getAsCarry(const TargetLowering &TLI, SDValue V, + bool ForceCarryReconstruction = false) { bool Masked = false; // First, peel away TRUNCATE/ZERO_EXTEND/AND nodes due to legalization. @@ -3030,20 +3031,25 @@ continue; } + if (ForceCarryReconstruction && V.getValueType() == MVT::i1) + return V; + break; } - // If this is not a carry, return. - if (V.getResNo() != 1) - return SDValue(); + if (!ForceCarryReconstruction) { + // If this is not a carry, return. + if (V.getResNo() != 1) + return SDValue(); - if (V.getOpcode() != ISD::UADDO_CARRY && V.getOpcode() != ISD::USUBO_CARRY && - V.getOpcode() != ISD::UADDO && V.getOpcode() != ISD::USUBO) - return SDValue(); + if (V.getOpcode() != ISD::UADDO_CARRY && V.getOpcode() != ISD::USUBO_CARRY && + V.getOpcode() != ISD::UADDO && V.getOpcode() != ISD::USUBO) + return SDValue(); - EVT VT = V->getValueType(0); - if (!TLI.isOperationLegalOrCustom(V.getOpcode(), VT)) - return SDValue(); + EVT VT = V->getValueType(0); + if (!TLI.isOperationLegalOrCustom(V.getOpcode(), VT)) + return SDValue(); + } // If the result is masked, then no matter what kind of bool it is we can // return. If it isn't, then we need to make sure the bool type is either 0 or @@ -3539,11 +3545,8 @@ return SDValue(); // Verify that the carry/borrow in is plausibly a carry/borrow bit. - // TODO: make getAsCarry() aware of how partial carries are merged. - if (CarryIn.getOpcode() != ISD::ZERO_EXTEND) - return SDValue(); - CarryIn = CarryIn.getOperand(0); - if (CarryIn.getValueType() != MVT::i1) + CarryIn = getAsCarry(TLI, CarryIn, true); + if (!CarryIn) return SDValue(); SDLoc DL(N); diff --git a/llvm/test/CodeGen/SystemZ/int-uadd-01.ll b/llvm/test/CodeGen/SystemZ/int-uadd-01.ll --- a/llvm/test/CodeGen/SystemZ/int-uadd-01.ll +++ b/llvm/test/CodeGen/SystemZ/int-uadd-01.ll @@ -271,9 +271,9 @@ ; CHECK-NEXT: .cfi_offset %r15, -40 ; CHECK-NEXT: aghi %r15, -168 ; CHECK-NEXT: .cfi_def_cfa_offset 328 -; CHECK-NEXT: l %r6, 0(%r2) -; CHECK-NEXT: l %r13, 8(%r2) -; CHECK-NEXT: l %r12, 16(%r2) +; CHECK-NEXT: l %r13, 0(%r2) +; CHECK-NEXT: l %r12, 8(%r2) +; CHECK-NEXT: l %r6, 16(%r2) ; CHECK-NEXT: l %r7, 24(%r2) ; CHECK-NEXT: l %r8, 32(%r2) ; CHECK-NEXT: l %r9, 40(%r2) @@ -282,34 +282,40 @@ ; CHECK-NEXT: mvc 160(4,%r15), 64(%r2) # 4-byte Folded Spill ; CHECK-NEXT: mvc 164(4,%r15), 72(%r2) # 4-byte Folded Spill ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: alr %r2, %r6 +; CHECK-NEXT: ar %r13, %r2 +; CHECK-NEXT: clr %r13, %r2 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: lr %r1, %r12 +; CHECK-NEXT: nilf %r1, 1 +; CHECK-NEXT: ar %r1, %r13 +; CHECK-NEXT: chi %r1, 0 ; CHECK-NEXT: ipm %r0 -; CHECK-NEXT: risbg %r0, %r0, 63, 191, 35 -; CHECK-NEXT: alr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r12 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r7 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r8 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r9 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r10 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alr %r2, %r11 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: al %r2, 160(%r15) # 4-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: al %r2, 164(%r15) # 4-byte Folded Reload +; CHECK-NEXT: afi %r0, -268435456 +; CHECK-NEXT: srl %r0, 31 +; CHECK-NEXT: nr %r0, %r12 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 36 +; CHECK-NEXT: alr %r1, %r6 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: alr %r1, %r7 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: alr %r1, %r8 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: alr %r1, %r9 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: alr %r1, %r10 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: alr %r1, %r11 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: al %r1, 160(%r15) # 4-byte Folded Reload +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: al %r1, 164(%r15) # 4-byte Folded Reload ; CHECK-NEXT: ipm %r1 ; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 ; CHECK-NEXT: risbg %r2, %r0, 63, 191, 0 diff --git a/llvm/test/CodeGen/SystemZ/int-uadd-02.ll b/llvm/test/CodeGen/SystemZ/int-uadd-02.ll --- a/llvm/test/CodeGen/SystemZ/int-uadd-02.ll +++ b/llvm/test/CodeGen/SystemZ/int-uadd-02.ll @@ -215,48 +215,53 @@ ; CHECK-NEXT: .cfi_offset %r15, -40 ; CHECK-NEXT: aghi %r15, -176 ; CHECK-NEXT: .cfi_def_cfa_offset 336 -; CHECK-NEXT: lg %r6, 0(%r2) +; CHECK-NEXT: lg %r11, 0(%r2) ; CHECK-NEXT: lg %r13, 16(%r2) ; CHECK-NEXT: lg %r12, 32(%r2) -; CHECK-NEXT: lg %r7, 48(%r2) -; CHECK-NEXT: lg %r8, 64(%r2) -; CHECK-NEXT: lg %r9, 80(%r2) -; CHECK-NEXT: lg %r10, 96(%r2) -; CHECK-NEXT: lg %r11, 112(%r2) +; CHECK-NEXT: lg %r6, 48(%r2) +; CHECK-NEXT: lg %r7, 64(%r2) +; CHECK-NEXT: lg %r8, 80(%r2) +; CHECK-NEXT: lg %r9, 96(%r2) +; CHECK-NEXT: lg %r10, 112(%r2) ; CHECK-NEXT: mvc 160(8,%r15), 128(%r2) # 8-byte Folded Spill ; CHECK-NEXT: mvc 168(8,%r15), 144(%r2) # 8-byte Folded Spill ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: algr %r2, %r6 -; CHECK-NEXT: ipm %r0 -; CHECK-NEXT: risbg %r0, %r0, 63, 191, 35 -; CHECK-NEXT: algr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r12 +; CHECK-NEXT: risbg %r0, %r13, 63, 191, 0 +; CHECK-NEXT: la %r1, 0(%r11,%r2) +; CHECK-NEXT: agr %r0, %r1 +; CHECK-NEXT: cghi %r0, 0 +; CHECK-NEXT: ipm %r3 +; CHECK-NEXT: afi %r3, -268435456 +; CHECK-NEXT: srl %r3, 31 +; CHECK-NEXT: nr %r13, %r3 +; CHECK-NEXT: clgr %r1, %r2 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r7 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 36 +; CHECK-NEXT: algr %r0, %r12 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r8 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: algr %r0, %r6 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r9 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: algr %r0, %r7 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r10 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: algr %r0, %r8 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algr %r2, %r11 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: algr %r0, %r9 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alg %r2, 160(%r15) # 8-byte Folded Reload +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: algr %r0, %r10 ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: alg %r2, 168(%r15) # 8-byte Folded Reload +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: alg %r0, 160(%r15) # 8-byte Folded Reload ; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: risbg %r2, %r0, 63, 191, 0 +; CHECK-NEXT: rosbg %r13, %r1, 63, 63, 35 +; CHECK-NEXT: alg %r0, 168(%r15) # 8-byte Folded Reload +; CHECK-NEXT: ipm %r0 +; CHECK-NEXT: rosbg %r13, %r0, 63, 63, 35 +; CHECK-NEXT: risbg %r2, %r13, 63, 191, 0 ; CHECK-NEXT: lmg %r6, %r15, 224(%r15) ; CHECK-NEXT: br %r14 %ptr1 = getelementptr i64, ptr %ptr0, i64 2 diff --git a/llvm/test/CodeGen/SystemZ/int-uadd-03.ll b/llvm/test/CodeGen/SystemZ/int-uadd-03.ll --- a/llvm/test/CodeGen/SystemZ/int-uadd-03.ll +++ b/llvm/test/CodeGen/SystemZ/int-uadd-03.ll @@ -258,34 +258,40 @@ ; CHECK-NEXT: st %r1, 64(%r2) ; CHECK-NEXT: st %r0, 72(%r2) ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: algfr %r2, %r12 +; CHECK-NEXT: risbg %r1, %r13, 63, 191, 0 +; CHECK-NEXT: lgr %r3, %r2 +; CHECK-NEXT: algfr %r3, %r12 +; CHECK-NEXT: agr %r1, %r3 +; CHECK-NEXT: cghi %r1, 0 ; CHECK-NEXT: ipm %r0 -; CHECK-NEXT: risbg %r0, %r0, 63, 191, 35 -; CHECK-NEXT: algfr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r6 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r7 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r8 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r9 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r10 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algfr %r2, %r11 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algf %r2, 160(%r15) # 4-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 -; CHECK-NEXT: algf %r2, 164(%r15) # 4-byte Folded Reload +; CHECK-NEXT: afi %r0, -268435456 +; CHECK-NEXT: srl %r0, 31 +; CHECK-NEXT: nr %r0, %r13 +; CHECK-NEXT: clgr %r3, %r2 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 36 +; CHECK-NEXT: algfr %r1, %r6 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algfr %r1, %r7 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algfr %r1, %r8 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algfr %r1, %r9 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algfr %r1, %r10 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algfr %r1, %r11 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algf %r1, 160(%r15) # 4-byte Folded Reload +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: algf %r1, 164(%r15) # 4-byte Folded Reload ; CHECK-NEXT: ipm %r1 ; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 35 ; CHECK-NEXT: risbg %r2, %r0, 63, 191, 0 diff --git a/llvm/test/CodeGen/SystemZ/int-usub-01.ll b/llvm/test/CodeGen/SystemZ/int-usub-01.ll --- a/llvm/test/CodeGen/SystemZ/int-usub-01.ll +++ b/llvm/test/CodeGen/SystemZ/int-usub-01.ll @@ -282,9 +282,9 @@ ; CHECK-NEXT: .cfi_offset %r15, -40 ; CHECK-NEXT: aghi %r15, -168 ; CHECK-NEXT: .cfi_def_cfa_offset 328 -; CHECK-NEXT: l %r6, 0(%r2) +; CHECK-NEXT: l %r12, 0(%r2) ; CHECK-NEXT: l %r13, 8(%r2) -; CHECK-NEXT: l %r12, 16(%r2) +; CHECK-NEXT: l %r6, 16(%r2) ; CHECK-NEXT: l %r7, 24(%r2) ; CHECK-NEXT: l %r8, 32(%r2) ; CHECK-NEXT: l %r9, 40(%r2) @@ -293,43 +293,47 @@ ; CHECK-NEXT: mvc 160(4,%r15), 64(%r2) # 4-byte Folded Spill ; CHECK-NEXT: mvc 164(4,%r15), 72(%r2) # 4-byte Folded Spill ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: slr %r2, %r6 +; CHECK-NEXT: lr %r1, %r2 +; CHECK-NEXT: sr %r1, %r12 +; CHECK-NEXT: clr %r1, %r2 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: chi %r1, 0 ; CHECK-NEXT: ipm %r0 -; CHECK-NEXT: afi %r0, -536870912 +; CHECK-NEXT: afi %r0, -268435456 ; CHECK-NEXT: srl %r0, 31 -; CHECK-NEXT: slr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r12 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r7 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r8 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r9 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r10 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slr %r2, %r11 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: sl %r2, 160(%r15) # 4-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: sl %r2, 164(%r15) # 4-byte Folded Reload +; CHECK-NEXT: nr %r0, %r13 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: nilf %r13, 1 +; CHECK-NEXT: sr %r1, %r13 +; CHECK-NEXT: slr %r1, %r6 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slr %r1, %r7 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slr %r1, %r8 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slr %r1, %r9 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slr %r1, %r10 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slr %r1, %r11 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: sl %r1, 160(%r15) # 4-byte Folded Reload +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: sl %r1, 164(%r15) # 4-byte Folded Reload ; CHECK-NEXT: ipm %r1 ; CHECK-NEXT: afi %r1, -536870912 ; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 diff --git a/llvm/test/CodeGen/SystemZ/int-usub-02.ll b/llvm/test/CodeGen/SystemZ/int-usub-02.ll --- a/llvm/test/CodeGen/SystemZ/int-usub-02.ll +++ b/llvm/test/CodeGen/SystemZ/int-usub-02.ll @@ -223,9 +223,9 @@ ; CHECK-NEXT: .cfi_offset %r15, -40 ; CHECK-NEXT: aghi %r15, -176 ; CHECK-NEXT: .cfi_def_cfa_offset 336 -; CHECK-NEXT: lg %r6, 0(%r2) +; CHECK-NEXT: lg %r12, 0(%r2) ; CHECK-NEXT: lg %r13, 16(%r2) -; CHECK-NEXT: lg %r12, 32(%r2) +; CHECK-NEXT: lg %r6, 32(%r2) ; CHECK-NEXT: lg %r7, 48(%r2) ; CHECK-NEXT: lg %r8, 64(%r2) ; CHECK-NEXT: lg %r9, 80(%r2) @@ -234,47 +234,52 @@ ; CHECK-NEXT: mvc 160(8,%r15), 128(%r2) # 8-byte Folded Spill ; CHECK-NEXT: mvc 168(8,%r15), 144(%r2) # 8-byte Folded Spill ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: slgr %r2, %r6 +; CHECK-NEXT: lgr %r0, %r2 +; CHECK-NEXT: sgr %r0, %r12 +; CHECK-NEXT: clgr %r0, %r2 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: cghi %r0, 0 +; CHECK-NEXT: ipm %r3 +; CHECK-NEXT: afi %r3, -268435456 +; CHECK-NEXT: srl %r3, 31 +; CHECK-NEXT: lr %r1, %r13 +; CHECK-NEXT: nr %r1, %r3 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 35 +; CHECK-NEXT: risbg %r2, %r13, 63, 191, 0 +; CHECK-NEXT: sgr %r0, %r2 +; CHECK-NEXT: slgr %r0, %r6 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slgr %r0, %r7 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slgr %r0, %r8 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slgr %r0, %r9 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slgr %r0, %r10 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slgr %r0, %r11 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slg %r0, 160(%r15) # 8-byte Folded Reload +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r1, %r2, 63, 63, 33 +; CHECK-NEXT: slg %r0, 168(%r15) # 8-byte Folded Reload ; CHECK-NEXT: ipm %r0 ; CHECK-NEXT: afi %r0, -536870912 -; CHECK-NEXT: srl %r0, 31 -; CHECK-NEXT: slgr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r12 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r7 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r8 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r9 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r10 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgr %r2, %r11 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slg %r2, 160(%r15) # 8-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slg %r2, 168(%r15) # 8-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: risbg %r2, %r0, 63, 191, 0 +; CHECK-NEXT: rosbg %r1, %r0, 63, 63, 33 +; CHECK-NEXT: risbg %r2, %r1, 63, 191, 0 ; CHECK-NEXT: lmg %r6, %r15, 224(%r15) ; CHECK-NEXT: br %r14 %ptr1 = getelementptr i64, ptr %ptr0, i64 2 diff --git a/llvm/test/CodeGen/SystemZ/int-usub-03.ll b/llvm/test/CodeGen/SystemZ/int-usub-03.ll --- a/llvm/test/CodeGen/SystemZ/int-usub-03.ll +++ b/llvm/test/CodeGen/SystemZ/int-usub-03.ll @@ -266,43 +266,47 @@ ; CHECK-NEXT: st %r1, 64(%r2) ; CHECK-NEXT: st %r0, 72(%r2) ; CHECK-NEXT: brasl %r14, foo@PLT -; CHECK-NEXT: slgfr %r2, %r12 +; CHECK-NEXT: lgr %r1, %r2 +; CHECK-NEXT: slgfr %r1, %r12 +; CHECK-NEXT: cghi %r1, 0 ; CHECK-NEXT: ipm %r0 -; CHECK-NEXT: afi %r0, -536870912 +; CHECK-NEXT: afi %r0, -268435456 ; CHECK-NEXT: srl %r0, 31 -; CHECK-NEXT: slgfr %r2, %r13 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r6 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r7 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r8 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r9 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r10 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgfr %r2, %r11 -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgf %r2, 160(%r15) # 4-byte Folded Reload -; CHECK-NEXT: ipm %r1 -; CHECK-NEXT: afi %r1, -536870912 -; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 -; CHECK-NEXT: slgf %r2, 164(%r15) # 4-byte Folded Reload +; CHECK-NEXT: nr %r0, %r13 +; CHECK-NEXT: clgr %r1, %r2 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 35 +; CHECK-NEXT: risbg %r2, %r13, 63, 191, 0 +; CHECK-NEXT: sgr %r1, %r2 +; CHECK-NEXT: slgfr %r1, %r6 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgfr %r1, %r7 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgfr %r1, %r8 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgfr %r1, %r9 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgfr %r1, %r10 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgfr %r1, %r11 +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgf %r1, 160(%r15) # 4-byte Folded Reload +; CHECK-NEXT: ipm %r2 +; CHECK-NEXT: afi %r2, -536870912 +; CHECK-NEXT: rosbg %r0, %r2, 63, 63, 33 +; CHECK-NEXT: slgf %r1, 164(%r15) # 4-byte Folded Reload ; CHECK-NEXT: ipm %r1 ; CHECK-NEXT: afi %r1, -536870912 ; CHECK-NEXT: rosbg %r0, %r1, 63, 63, 33 diff --git a/llvm/test/CodeGen/X86/addcarry.ll b/llvm/test/CodeGen/X86/addcarry.ll --- a/llvm/test/CodeGen/X86/addcarry.ll +++ b/llvm/test/CodeGen/X86/addcarry.ll @@ -637,7 +637,7 @@ ; CHECK-LABEL: addcarry_fake_carry: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rdi, %rax -; CHECK-NEXT: btl $0, %edx +; CHECK-NEXT: addl $-1, %edx ; CHECK-NEXT: adcq %rsi, %rax ; CHECK-NEXT: setb %dl ; CHECK-NEXT: retq @@ -660,11 +660,9 @@ ; CHECK-LABEL: addcarry_carry_not_zext: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rdi, %rax -; CHECK-NEXT: addq %rsi, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: addq %rdx, %rax +; CHECK-NEXT: addq $-1, %rdx +; CHECK-NEXT: adcq %rsi, %rax ; CHECK-NEXT: setb %dl -; CHECK-NEXT: orb %cl, %dl ; CHECK-NEXT: retq %t1 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) %partial = extractvalue { i64, i1 } %t1, 0 @@ -683,12 +681,10 @@ define { i64, i1 } @addcarry_carry_not_i1(i64 %a, i64 %b, i8 %carryin) nounwind { ; CHECK-LABEL: addcarry_carry_not_i1: ; CHECK: # %bb.0: -; CHECK-NEXT: addq %rsi, %rdi -; CHECK-NEXT: setb %cl -; CHECK-NEXT: movzbl %dl, %eax -; CHECK-NEXT: addq %rdi, %rax +; CHECK-NEXT: movq %rdi, %rax +; CHECK-NEXT: addl $-1, %edx +; CHECK-NEXT: adcq %rsi, %rax ; CHECK-NEXT: setb %dl -; CHECK-NEXT: orb %cl, %dl ; CHECK-NEXT: retq %t1 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) %partial = extractvalue { i64, i1 } %t1, 0 diff --git a/llvm/test/CodeGen/X86/subcarry.ll b/llvm/test/CodeGen/X86/subcarry.ll --- a/llvm/test/CodeGen/X86/subcarry.ll +++ b/llvm/test/CodeGen/X86/subcarry.ll @@ -346,7 +346,7 @@ ; CHECK-LABEL: subcarry_fake_carry: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rdi, %rax -; CHECK-NEXT: btl $0, %edx +; CHECK-NEXT: addl $-1, %edx ; CHECK-NEXT: sbbq %rsi, %rax ; CHECK-NEXT: setb %dl ; CHECK-NEXT: retq @@ -369,11 +369,9 @@ ; CHECK-LABEL: subcarry_carry_not_zext: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rdi, %rax -; CHECK-NEXT: subq %rsi, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: subq %rdx, %rax +; CHECK-NEXT: addq $-1, %rdx +; CHECK-NEXT: sbbq %rsi, %rax ; CHECK-NEXT: setb %dl -; CHECK-NEXT: orb %cl, %dl ; CHECK-NEXT: retq %t1 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %a, i64 %b) %partial = extractvalue { i64, i1 } %t1, 0 @@ -393,12 +391,9 @@ ; CHECK-LABEL: subcarry_carry_not_i1: ; CHECK: # %bb.0: ; CHECK-NEXT: movq %rdi, %rax -; CHECK-NEXT: subq %rsi, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: movzbl %dl, %edx -; CHECK-NEXT: subq %rdx, %rax +; CHECK-NEXT: addl $-1, %edx +; CHECK-NEXT: sbbq %rsi, %rax ; CHECK-NEXT: setb %dl -; CHECK-NEXT: orb %cl, %dl ; CHECK-NEXT: retq %t1 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %a, i64 %b) %partial = extractvalue { i64, i1 } %t1, 0