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 @@ -533,6 +533,8 @@ SDValue foldSelectOfConstants(SDNode *N); SDValue foldVSelectOfConstants(SDNode *N); + bool matchSelectOfConstants(SDValue Sel, SDValue &Cond, SDValue &CT, + SDValue &CF); SDValue foldBinOpIntoSelect(SDNode *BO); bool SimplifySelectOps(SDNode *SELECT, SDValue LHS, SDValue RHS); SDValue hoistLogicOpWithSameOpcodeHands(SDNode *N); @@ -2243,6 +2245,77 @@ return SDValue(); } +static bool matchCondition(SDValue V) { + while (true) { + if (V.getValueType() == MVT::i1) + return true; + + if (V.getOpcode() == ISD::AND && isOneConstant(V.getOperand(1))) + return true; + + if (V.getOpcode() == ISD::XOR && isOneConstant(V.getOperand(1))) { + V = V.getOperand(0); + continue; + } + + // Peek through truncate and zext. + if (V.getOpcode() == ISD::TRUNCATE || V.getOpcode() == ISD::ZERO_EXTEND) { + V = V.getOperand(0); + continue; + } + + break; + } + + return false; +} + +bool DAGCombiner::matchSelectOfConstants(SDValue V, SDValue &Cond, SDValue &CT, + SDValue &CF) { + if (!V.hasOneUse()) + return false; + + if (V.getOpcode() == ISD::SELECT) { + Cond = V.getOperand(0); + CT = V.getOperand(1); + CF = V.getOperand(2); + + return (isConstantOrConstantVector(CT, true) || + DAG.isConstantFPBuildVectorOrConstantFP(CT)) && + (isConstantOrConstantVector(CF, true) || + DAG.isConstantFPBuildVectorOrConstantFP(CF)); + } + + // op Cond, C -> select Cond, (op 1, C), (op 0, C) + unsigned opcode = V->getOpcode(); + if (!LegalTypes && TLI.isBinOp(opcode) && V->getNumValues() == 1) { + Cond = V.getOperand(0); + auto C = V.getOperand(1); + if ((isConstantOrConstantVector(C, true) || + DAG.isConstantFPBuildVectorOrConstantFP(C)) && + matchCondition(Cond)) { + auto DL = SDLoc(V); + auto VT = V.getValueType(); + + SDValue One = DAG.getConstant(1, DL, VT); + CT = DAG.getNode(opcode, DL, VT, One, C); + if (!isConstantOrConstantVector(CT, true) && + !DAG.isConstantFPBuildVectorOrConstantFP(CT)) + return false; + + SDValue Zero = DAG.getConstant(0, DL, VT); + CF = DAG.getNode(opcode, DL, VT, Zero, C); + if (!isConstantOrConstantVector(CF, true) && + !DAG.isConstantFPBuildVectorOrConstantFP(CF)) + return false; + + return true; + } + } + + return false; +} + SDValue DAGCombiner::foldBinOpIntoSelect(SDNode *BO) { assert(TLI.isBinOp(BO->getOpcode()) && BO->getNumValues() == 1 && "Unexpected binary operator"); @@ -2259,35 +2332,27 @@ return Sel; } + SDValue Cond, CT, CF; + // Don't do this unless the old select is going away. We want to eliminate the // binary operator, not replace a binop with a select. // TODO: Handle ISD::SELECT_CC. unsigned SelOpNo = 0; SDValue Sel = BO->getOperand(0); - if (Sel.getOpcode() != ISD::SELECT || !Sel.hasOneUse()) { + if (!matchSelectOfConstants(Sel, Cond, CT, CF)) { SelOpNo = 1; Sel = BO->getOperand(1); + if (!matchSelectOfConstants(Sel, Cond, CT, CF)) + return SDValue(); } - if (Sel.getOpcode() != ISD::SELECT || !Sel.hasOneUse()) - return SDValue(); - - SDValue CT = Sel.getOperand(1); - if (!isConstantOrConstantVector(CT, true) && - !DAG.isConstantFPBuildVectorOrConstantFP(CT)) - return SDValue(); - - SDValue CF = Sel.getOperand(2); - if (!isConstantOrConstantVector(CF, true) && - !DAG.isConstantFPBuildVectorOrConstantFP(CF)) - return SDValue(); - // Bail out if any constants are opaque because we can't constant fold those. // The exception is "and" and "or" with either 0 or -1 in which case we can // propagate non constant operands into select. I.e.: // and (select Cond, 0, -1), X --> select Cond, 0, X // or X, (select Cond, -1, 0) --> select Cond, -1, X bool CanFoldNonConst = + (Sel.getOpcode() == ISD::SELECT) && (BinOpcode == ISD::AND || BinOpcode == ISD::OR) && (isNullOrNullSplat(CT) || isAllOnesOrAllOnesSplat(CT)) && (isNullOrNullSplat(CF) || isAllOnesOrAllOnesSplat(CF)); @@ -2316,8 +2381,16 @@ !DAG.isConstantFPBuildVectorOrConstantFP(NewCF)) return SDValue(); - SDValue SelectOp = DAG.getSelect(DL, VT, Sel.getOperand(0), NewCT, NewCF); + SDValue SelectOp = DAG.getSelect(DL, VT, Cond, NewCT, NewCF); SelectOp->setFlags(BO->getFlags()); + + // It is likely that we get a slect of constant here, so we premptively try to + // fold. + if (SelectOp.getOpcode() == ISD::SELECT) { + if (SDValue Combined = foldSelectOfConstants(SelectOp.getNode())) + return Combined.getNode() == BO ? SDValue() : Combined; + } + return SelectOp; } @@ -10113,6 +10186,8 @@ } SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) { + assert(N->getOpcode() == ISD::SELECT && "Expecting select"); + SDValue Cond = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); diff --git a/llvm/test/CodeGen/AMDGPU/anyext.ll b/llvm/test/CodeGen/AMDGPU/anyext.ll --- a/llvm/test/CodeGen/AMDGPU/anyext.ll +++ b/llvm/test/CodeGen/AMDGPU/anyext.ll @@ -27,11 +27,9 @@ ; GFX8-NEXT: s_mov_b32 s3, 0xf000 ; GFX8-NEXT: s_mov_b32 s2, -1 ; GFX8-NEXT: s_waitcnt lgkmcnt(0) -; GFX8-NEXT: s_cmp_eq_u32 s4, 0 +; GFX8-NEXT: s_cmp_lg_u32 s4, 0 ; GFX8-NEXT: s_cselect_b64 s[4:5], -1, 0 ; GFX8-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5] -; GFX8-NEXT: v_not_b32_e32 v0, v0 -; GFX8-NEXT: v_and_b32_e32 v0, 1, v0 ; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0 ; GFX8-NEXT: s_endpgm ; @@ -42,11 +40,9 @@ ; GFX9-NEXT: s_mov_b32 s7, 0xf000 ; GFX9-NEXT: s_mov_b32 s6, -1 ; GFX9-NEXT: s_waitcnt lgkmcnt(0) -; GFX9-NEXT: s_cmp_eq_u32 s2, 0 +; GFX9-NEXT: s_cmp_lg_u32 s2, 0 ; GFX9-NEXT: s_cselect_b64 s[0:1], -1, 0 ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1] -; GFX9-NEXT: v_not_b32_e32 v0, v0 -; GFX9-NEXT: v_and_b32_e32 v0, 1, v0 ; GFX9-NEXT: buffer_store_dword v0, off, s[4:7], 0 ; GFX9-NEXT: s_endpgm entry: diff --git a/llvm/test/CodeGen/ARM/pr36577.ll b/llvm/test/CodeGen/ARM/pr36577.ll --- a/llvm/test/CodeGen/ARM/pr36577.ll +++ b/llvm/test/CodeGen/ARM/pr36577.ll @@ -12,21 +12,24 @@ ; CHECK-LABEL: pr36577: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: movw r0, :lower16:a -; CHECK-NEXT: mvn r1, #7 +; CHECK-NEXT: mov r2, #1 ; CHECK-NEXT: movt r0, :upper16:a -; CHECK-NEXT: ldrh r0, [r0] -; CHECK-NEXT: mvn r0, r0, lsr #7 -; CHECK-NEXT: orr r0, r1, r0, lsl #2 +; CHECK-NEXT: ldrh r1, [r0] +; CHECK-NEXT: mvn r0, #3 +; CHECK-NEXT: tst r2, r1, lsr #7 +; CHECK-NEXT: mvnne r0, #7 ; CHECK-NEXT: bx lr ; ; CHECK-T2-LABEL: pr36577: ; CHECK-T2: @ %bb.0: @ %entry ; CHECK-T2-NEXT: movw r0, :lower16:a -; CHECK-T2-NEXT: mvn r1, #7 ; CHECK-T2-NEXT: movt r0, :upper16:a ; CHECK-T2-NEXT: ldrh r0, [r0] -; CHECK-T2-NEXT: mvn.w r0, r0, lsr #7 -; CHECK-T2-NEXT: orr.w r0, r1, r0, lsl #2 +; CHECK-T2-NEXT: lsrs r0, r0, #7 +; CHECK-T2-NEXT: lsls r0, r0, #31 +; CHECK-T2-NEXT: mvn r0, #3 +; CHECK-T2-NEXT: it ne +; CHECK-T2-NEXT: mvnne r0, #7 ; CHECK-T2-NEXT: bx lr entry: %0 = load i16, i16* @a, align 2 diff --git a/llvm/test/CodeGen/VE/Scalar/atomic.ll b/llvm/test/CodeGen/VE/Scalar/atomic.ll --- a/llvm/test/CodeGen/VE/Scalar/atomic.ll +++ b/llvm/test/CodeGen/VE/Scalar/atomic.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s ;;; Test atomicrmw operations @@ -19,7 +20,7 @@ ; CHECK-NEXT: ldl.sx %s2, (, %s0) ; CHECK-NEXT: lea %s1, -256 ; CHECK-NEXT: and %s1, %s1, (32)0 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB0_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: adds.w.sx %s2, 1, %s2 @@ -27,7 +28,7 @@ ; CHECK-NEXT: and %s4, %s3, %s1 ; CHECK-NEXT: or %s2, %s4, %s2 ; CHECK-NEXT: cas.w %s2, (%s0), %s3 -; CHECK-NEXT: brne.w %s2, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s2, %s3, .LBB0_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: sll %s0, %s2, 56 ; CHECK-NEXT: sra.l %s0, %s0, 56 @@ -50,7 +51,7 @@ ; CHECK-NEXT: ldl.sx %s2, (, %s0) ; CHECK-NEXT: lea %s1, -65536 ; CHECK-NEXT: and %s1, %s1, (32)0 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB1_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: adds.w.sx %s2, -1, %s2 @@ -58,7 +59,7 @@ ; CHECK-NEXT: and %s4, %s3, %s1 ; CHECK-NEXT: or %s2, %s4, %s2 ; CHECK-NEXT: cas.w %s2, (%s0), %s3 -; CHECK-NEXT: brne.w %s2, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s2, %s3, .LBB1_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: sll %s0, %s2, 48 ; CHECK-NEXT: sra.l %s0, %s0, 48 @@ -78,12 +79,12 @@ ; CHECK-NEXT: and %s0, %s0, (32)0 ; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) ; CHECK-NEXT: ldl.sx %s1, (, %s0) -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB2_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s2, 0, %s1 ; CHECK-NEXT: and %s1, 1, %s2 ; CHECK-NEXT: cas.w %s1, (%s0), %s2 -; CHECK-NEXT: brne.w %s1, %s2, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s1, %s2, .LBB2_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 ; CHECK-NEXT: fencem 3 @@ -101,12 +102,12 @@ ; CHECK-NEXT: and %s0, %s0, (32)0 ; CHECK-NEXT: lea.sl %s1, l@hi(, %s0) ; CHECK-NEXT: ld %s0, (, %s1) -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB3_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s2, 0, %s0 ; CHECK-NEXT: or %s0, 1, %s0 ; CHECK-NEXT: cas.l %s0, (%s1), %s2 -; CHECK-NEXT: brne.l %s0, %s2, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.l %s0, %s2, .LBB3_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: b.l.t (, %s10) @@ -125,12 +126,12 @@ ; CHECK-NEXT: lea.sl %s0, c@hi(, %s0) ; CHECK-NEXT: and %s1, -4, %s0 ; CHECK-NEXT: ldl.sx %s0, (, %s1) -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB4_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s2, 0, %s0 ; CHECK-NEXT: xor %s0, 1, %s2 ; CHECK-NEXT: cas.w %s0, (%s1), %s2 -; CHECK-NEXT: brne.w %s0, %s2, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s0, %s2, .LBB4_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: sll %s0, %s0, 56 ; CHECK-NEXT: sra.l %s0, %s0, 56 @@ -151,19 +152,18 @@ ; CHECK-NEXT: lea.sl %s0, s@hi(, %s0) ; CHECK-NEXT: and %s0, -4, %s0 ; CHECK-NEXT: ldl.sx %s2, (, %s0) -; CHECK-NEXT: lea %s1, 65534 -; CHECK-NEXT: lea %s3, -65536 -; CHECK-NEXT: and %s3, %s3, (32)0 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: lea %s1, -65536 +; CHECK-NEXT: and %s1, %s1, (32)0 +; CHECK-NEXT: .LBB5_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: or %s4, 0, %s2 -; CHECK-NEXT: xor %s2, -1, %s4 -; CHECK-NEXT: or %s2, %s2, %s1 -; CHECK-NEXT: and %s2, %s2, (48)0 -; CHECK-NEXT: and %s5, %s4, %s3 -; CHECK-NEXT: or %s2, %s5, %s2 -; CHECK-NEXT: cas.w %s2, (%s0), %s4 -; CHECK-NEXT: brne.w %s2, %s4, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: or %s3, 0, %s2 +; CHECK-NEXT: and %s2, 1, %s3 +; CHECK-NEXT: and %s4, %s3, %s1 +; CHECK-NEXT: lea %s5, 65534 +; CHECK-NEXT: cmov.w.eq %s5, (48)0, %s2 +; CHECK-NEXT: or %s2, %s4, %s5 +; CHECK-NEXT: cas.w %s2, (%s0), %s3 +; CHECK-NEXT: brne.w %s2, %s3, .LBB5_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: sll %s0, %s2, 48 ; CHECK-NEXT: sra.l %s0, %s0, 48 @@ -184,12 +184,12 @@ ; CHECK-NEXT: lea.sl %s1, i@hi(, %s0) ; CHECK-NEXT: ldl.sx %s0, (, %s1) ; CHECK-NEXT: or %s2, 1, (0)1 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB6_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s0 ; CHECK-NEXT: maxs.w.sx %s0, %s0, %s2 ; CHECK-NEXT: cas.w %s0, (%s1), %s3 -; CHECK-NEXT: brne.w %s0, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s0, %s3, .LBB6_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 ; CHECK-NEXT: fencem 3 @@ -209,14 +209,14 @@ ; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) ; CHECK-NEXT: ldl.sx %s1, (, %s0) ; CHECK-NEXT: or %s2, 2, (0)1 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB7_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s1 ; CHECK-NEXT: cmps.w.sx %s4, %s1, %s2 ; CHECK-NEXT: or %s1, 1, (0)1 ; CHECK-NEXT: cmov.w.lt %s1, %s3, %s4 ; CHECK-NEXT: cas.w %s1, (%s0), %s3 -; CHECK-NEXT: brne.w %s1, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s1, %s3, .LBB7_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 ; CHECK-NEXT: fencem 3 @@ -236,14 +236,14 @@ ; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) ; CHECK-NEXT: ldl.sx %s1, (, %s0) ; CHECK-NEXT: or %s2, 1, (0)1 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB8_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s1 ; CHECK-NEXT: cmpu.w %s4, %s1, %s2 ; CHECK-NEXT: or %s1, 1, (0)1 ; CHECK-NEXT: cmov.w.gt %s1, %s3, %s4 ; CHECK-NEXT: cas.w %s1, (%s0), %s3 -; CHECK-NEXT: brne.w %s1, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s1, %s3, .LBB8_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 ; CHECK-NEXT: fencem 3 @@ -263,14 +263,14 @@ ; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) ; CHECK-NEXT: ldl.sx %s1, (, %s0) ; CHECK-NEXT: or %s2, 2, (0)1 -; CHECK-NEXT: .LBB{{[0-9]+}}_1: # %atomicrmw.start +; CHECK-NEXT: .LBB9_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s1 ; CHECK-NEXT: cmpu.w %s4, %s1, %s2 ; CHECK-NEXT: or %s1, 1, (0)1 ; CHECK-NEXT: cmov.w.lt %s1, %s3, %s4 ; CHECK-NEXT: cas.w %s1, (%s0), %s3 -; CHECK-NEXT: brne.w %s1, %s3, .LBB{{[0-9]+}}_1 +; CHECK-NEXT: brne.w %s1, %s3, .LBB9_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 ; CHECK-NEXT: fencem 3 diff --git a/llvm/test/CodeGen/X86/dagcombine-select.ll b/llvm/test/CodeGen/X86/dagcombine-select.ll --- a/llvm/test/CodeGen/X86/dagcombine-select.ll +++ b/llvm/test/CodeGen/X86/dagcombine-select.ll @@ -181,10 +181,10 @@ ; CHECK-LABEL: sel_constants_shl_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: notb %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: andl $1, %eax -; CHECK-NEXT: orl $2, %eax -; CHECK-NEXT: shll $8, %eax +; CHECK-NEXT: testb $1, %dil +; CHECK-NEXT: movl $768, %ecx # imm = 0x300 +; CHECK-NEXT: movl $512, %eax # imm = 0x200 +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 2, i32 3 %bo = shl i32 %sel, 8 @@ -195,8 +195,9 @@ ; CHECK-LABEL: shl_constant_sel_constants: ; CHECK: # %bb.0: ; CHECK-NEXT: notb %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: testb $1, %dil +; CHECK-NEXT: setne %al ; CHECK-NEXT: leal 4(,%rax,4), %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 2, i32 3 @@ -207,9 +208,10 @@ define i32 @lshr_constant_sel_constants(i1 %cond) { ; CHECK-LABEL: lshr_constant_sel_constants: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: andl $1, %edi -; CHECK-NEXT: leal 8(,%rdi,8), %eax +; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: testb $1, %dil +; CHECK-NEXT: setne %al +; CHECK-NEXT: leal 8(,%rax,8), %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 2, i32 3 %bo = lshr i32 64, %sel @@ -219,10 +221,10 @@ define i32 @ashr_constant_sel_constants(i1 %cond) { ; CHECK-LABEL: ashr_constant_sel_constants: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: andl $1, %edi -; CHECK-NEXT: shll $4, %edi -; CHECK-NEXT: leal 16(%rdi), %eax +; CHECK-NEXT: testb $1, %dil +; CHECK-NEXT: movl $32, %ecx +; CHECK-NEXT: movl $16, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 2, i32 3 %bo = ashr i32 128, %sel diff --git a/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll b/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll --- a/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll @@ -160,9 +160,9 @@ ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind @@ -292,9 +292,9 @@ ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB16_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind @@ -337,9 +337,9 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB18_2 ; X86-NEXT: .LBB18_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB18_2: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -371,10 +371,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB19_3 ; X86-NEXT: .LBB19_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB19_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -420,10 +420,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB21_3 ; X86-NEXT: .LBB21_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB21_3: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -455,10 +455,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB22_3 ; X86-NEXT: .LBB22_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB22_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -617,10 +617,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB29_4 ; X86-NEXT: .LBB29_3: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB29_4: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -742,10 +742,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB33_5 ; X86-NEXT: .LBB33_4: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB33_5: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -856,10 +856,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB35_5 ; X86-NEXT: .LBB35_4: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB35_5: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -905,10 +905,10 @@ ; X86-NEXT: cmpl %ecx, %eax ; X86-NEXT: je .LBB36_5 ; X86-NEXT: .LBB36_4: # %res_block -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %ecx, %eax -; X86-NEXT: setae %dl -; X86-NEXT: leal -1(%edx,%edx), %edx +; X86-NEXT: movl $1, %eax +; X86-NEXT: movl $-1, %edx +; X86-NEXT: cmovael %eax, %edx ; X86-NEXT: .LBB36_5: # %endblock ; X86-NEXT: testl %edx, %edx ; X86-NEXT: setg %al diff --git a/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll b/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll --- a/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll +++ b/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll @@ -152,9 +152,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -268,9 +268,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB16_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -309,9 +309,9 @@ ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq ; X64-NEXT: .LBB18_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -338,10 +338,10 @@ ; X64-NEXT: cmpl %edx, %ecx ; X64-NEXT: je .LBB19_3 ; X64-NEXT: .LBB19_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB19_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind @@ -381,10 +381,10 @@ ; X64-NEXT: cmpl %edx, %ecx ; X64-NEXT: je .LBB21_3 ; X64-NEXT: .LBB21_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB21_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -514,10 +514,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB29_3 ; X64-NEXT: .LBB29_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB29_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -589,10 +589,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB33_3 ; X64-NEXT: .LBB33_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB33_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind @@ -659,10 +659,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB35_3 ; X64-NEXT: .LBB35_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB35_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -690,10 +690,10 @@ ; X64-NEXT: cmpq %rcx, %rax ; X64-NEXT: je .LBB36_3 ; X64-NEXT: .LBB36_2: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB36_3: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -770,10 +770,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB38_4 ; X64-NEXT: .LBB38_3: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB38_4: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind @@ -862,10 +862,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB40_4 ; X64-NEXT: .LBB40_3: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB40_4: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -900,10 +900,10 @@ ; X64-NEXT: cmpq %rcx, %rax ; X64-NEXT: je .LBB41_4 ; X64-NEXT: .LBB41_3: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB41_4: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -997,10 +997,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB43_5 ; X64-NEXT: .LBB43_4: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB43_5: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind @@ -1095,10 +1095,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB45_5 ; X64-NEXT: .LBB45_4: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB45_5: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -1140,10 +1140,10 @@ ; X64-NEXT: cmpq %rcx, %rax ; X64-NEXT: je .LBB46_5 ; X64-NEXT: .LBB46_4: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB46_5: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -1293,10 +1293,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB49_5 ; X64-NEXT: .LBB49_4: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB49_5: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind @@ -1406,10 +1406,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB51_5 ; X64-NEXT: .LBB51_4: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB51_5: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -1451,10 +1451,10 @@ ; X64-NEXT: cmpq %rcx, %rax ; X64-NEXT: je .LBB52_5 ; X64-NEXT: .LBB52_4: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB52_5: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al diff --git a/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll b/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll --- a/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll @@ -88,9 +88,12 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB4_2 ; X86-NEXT: .LBB4_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: decl %ecx +; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax +; X86-NEXT: cmpw %si, %dx +; X86-NEXT: cmovbl %ecx, %eax ; X86-NEXT: .LBB4_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -178,9 +181,12 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB9_2 ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: decl %ecx +; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax +; X86-NEXT: cmpl %esi, %edx +; X86-NEXT: cmovbl %ecx, %eax ; X86-NEXT: .LBB9_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -227,10 +233,12 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB11_3 ; X86-NEXT: .LBB11_2: # %res_block +; X86-NEXT: xorl %esi, %esi +; X86-NEXT: decl %esi ; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: cmovbl %esi, %eax ; X86-NEXT: .LBB11_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl diff --git a/llvm/test/CodeGen/X86/memcmp-optsize.ll b/llvm/test/CodeGen/X86/memcmp-optsize.ll --- a/llvm/test/CodeGen/X86/memcmp-optsize.ll +++ b/llvm/test/CodeGen/X86/memcmp-optsize.ll @@ -80,9 +80,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB4_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -158,9 +158,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -255,10 +255,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB15_3 ; X64-NEXT: .LBB15_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB15_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -285,10 +285,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB16_3 ; X64-NEXT: .LBB16_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB16_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind diff --git a/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll b/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll --- a/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll @@ -88,9 +88,12 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB4_2 ; X86-NEXT: .LBB4_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: decl %ecx +; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax +; X86-NEXT: cmpw %si, %dx +; X86-NEXT: cmovbl %ecx, %eax ; X86-NEXT: .LBB4_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -178,9 +181,12 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB9_2 ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: decl %ecx +; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax +; X86-NEXT: cmpl %esi, %edx +; X86-NEXT: cmovbl %ecx, %eax ; X86-NEXT: .LBB9_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -227,10 +233,12 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB11_3 ; X86-NEXT: .LBB11_2: # %res_block +; X86-NEXT: xorl %esi, %esi +; X86-NEXT: decl %esi ; X86-NEXT: xorl %eax, %eax +; X86-NEXT: incl %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: cmovbl %esi, %eax ; X86-NEXT: .LBB11_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl diff --git a/llvm/test/CodeGen/X86/memcmp-pgso.ll b/llvm/test/CodeGen/X86/memcmp-pgso.ll --- a/llvm/test/CodeGen/X86/memcmp-pgso.ll +++ b/llvm/test/CodeGen/X86/memcmp-pgso.ll @@ -80,9 +80,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB4_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -158,9 +158,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -255,10 +255,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB15_3 ; X64-NEXT: .LBB15_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB15_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -285,10 +285,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB16_3 ; X64-NEXT: .LBB16_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB16_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind diff --git a/llvm/test/CodeGen/X86/memcmp-x32.ll b/llvm/test/CodeGen/X86/memcmp-x32.ll --- a/llvm/test/CodeGen/X86/memcmp-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-x32.ll @@ -188,9 +188,9 @@ ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB11_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind @@ -320,9 +320,9 @@ ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB18_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind @@ -365,9 +365,9 @@ ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB20_2 ; X86-NEXT: .LBB20_3: # %res_block -; X86-NEXT: setae %al -; X86-NEXT: movzbl %al, %eax -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB20_2: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -399,10 +399,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB21_3 ; X86-NEXT: .LBB21_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB21_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -431,10 +431,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB22_3 ; X86-NEXT: .LBB22_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB22_3: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -483,10 +483,10 @@ ; X86-NEXT: cmpl %edx, %ecx ; X86-NEXT: je .LBB24_3 ; X86-NEXT: .LBB24_2: # %res_block -; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: setae %al -; X86-NEXT: leal -1(%eax,%eax), %eax +; X86-NEXT: movl $1, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovael %ecx, %eax ; X86-NEXT: .LBB24_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl diff --git a/llvm/test/CodeGen/X86/memcmp.ll b/llvm/test/CodeGen/X86/memcmp.ll --- a/llvm/test/CodeGen/X86/memcmp.ll +++ b/llvm/test/CodeGen/X86/memcmp.ll @@ -178,9 +178,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB11_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -294,9 +294,9 @@ ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB18_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -335,9 +335,9 @@ ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq ; X64-NEXT: .LBB20_3: # %res_block -; X64-NEXT: setae %al -; X64-NEXT: movzbl %al, %eax -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -364,10 +364,10 @@ ; X64-NEXT: cmpl %edx, %ecx ; X64-NEXT: je .LBB21_3 ; X64-NEXT: .LBB21_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB21_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind @@ -392,10 +392,10 @@ ; X64-NEXT: cmpl %edx, %ecx ; X64-NEXT: je .LBB22_3 ; X64-NEXT: .LBB22_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB22_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -540,10 +540,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB31_3 ; X64-NEXT: .LBB31_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB31_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -598,10 +598,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB34_3 ; X64-NEXT: .LBB34_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB34_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind @@ -626,10 +626,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB35_3 ; X64-NEXT: .LBB35_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB35_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -655,10 +655,10 @@ ; X64-NEXT: cmpq %rcx, %rdx ; X64-NEXT: je .LBB36_3 ; X64-NEXT: .LBB36_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rcx, %rdx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB36_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind @@ -696,10 +696,10 @@ ; X64-NEXT: cmpq %rax, %rcx ; X64-NEXT: je .LBB38_3 ; X64-NEXT: .LBB38_2: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rax, %rcx -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB38_3: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -729,10 +729,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB39_3 ; X64-NEXT: .LBB39_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB39_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind @@ -799,10 +799,10 @@ ; X64-NEXT: cmpq %rdx, %rcx ; X64-NEXT: je .LBB41_3 ; X64-NEXT: .LBB41_2: # %res_block -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: setae %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovael %ecx, %eax ; X64-NEXT: .LBB41_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -830,10 +830,10 @@ ; X64-NEXT: cmpq %rcx, %rax ; X64-NEXT: je .LBB42_3 ; X64-NEXT: .LBB42_2: # %res_block -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: setae %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovael %eax, %edx ; X64-NEXT: .LBB42_3: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al diff --git a/llvm/test/CodeGen/X86/midpoint-int.ll b/llvm/test/CodeGen/X86/midpoint-int.ll --- a/llvm/test/CodeGen/X86/midpoint-int.ll +++ b/llvm/test/CodeGen/X86/midpoint-int.ll @@ -14,10 +14,10 @@ define i32 @scalar_i32_signed_reg_reg(i32 %a1, i32 %a2) nounwind { ; X64-LABEL: scalar_i32_signed_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %esi, %edi -; X64-NEXT: setle %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovlel %ecx, %eax ; X64-NEXT: movl %edi, %ecx ; X64-NEXT: cmovgl %esi, %ecx ; X64-NEXT: cmovgl %edi, %esi @@ -32,17 +32,16 @@ ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %eax, %ecx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB0_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB0_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB0_3 -; X86-NEXT: .LBB0_1: +; X86-NEXT: movl $-1, %edx ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB0_3 +; X86-NEXT: .LBB0_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB0_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: shrl %eax @@ -64,10 +63,10 @@ define i32 @scalar_i32_unsigned_reg_reg(i32 %a1, i32 %a2) nounwind { ; X64-LABEL: scalar_i32_unsigned_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %esi, %edi -; X64-NEXT: setbe %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovbel %ecx, %eax ; X64-NEXT: movl %edi, %ecx ; X64-NEXT: cmoval %esi, %ecx ; X64-NEXT: cmoval %edi, %esi @@ -82,17 +81,16 @@ ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %eax, %ecx -; X86-NEXT: setbe %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: ja .LBB1_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jbe .LBB1_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB1_3 -; X86-NEXT: .LBB1_1: +; X86-NEXT: movl $-1, %edx ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB1_3 +; X86-NEXT: .LBB1_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB1_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: shrl %eax @@ -117,10 +115,10 @@ ; X64-LABEL: scalar_i32_signed_mem_reg: ; X64: # %bb.0: ; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %esi, %ecx -; X64-NEXT: setle %al -; X64-NEXT: leal -1(%rax,%rax), %eax +; X64-NEXT: movl $1, %edx +; X64-NEXT: movl $-1, %eax +; X64-NEXT: cmovlel %edx, %eax ; X64-NEXT: movl %ecx, %edx ; X64-NEXT: cmovgl %esi, %edx ; X64-NEXT: cmovgl %ecx, %esi @@ -136,17 +134,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl (%ecx), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %eax, %ecx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB2_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB2_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB2_3 -; X86-NEXT: .LBB2_1: +; X86-NEXT: movl $-1, %edx ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB2_3 +; X86-NEXT: .LBB2_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB2_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: shrl %eax @@ -170,16 +167,16 @@ ; X64-LABEL: scalar_i32_signed_reg_mem: ; X64: # %bb.0: ; X64-NEXT: movl (%rsi), %eax -; X64-NEXT: xorl %ecx, %ecx ; X64-NEXT: cmpl %eax, %edi -; X64-NEXT: setle %cl -; X64-NEXT: leal -1(%rcx,%rcx), %ecx -; X64-NEXT: movl %edi, %edx -; X64-NEXT: cmovgl %eax, %edx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $-1, %edx +; X64-NEXT: cmovlel %ecx, %edx +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: cmovgl %eax, %ecx ; X64-NEXT: cmovgl %edi, %eax -; X64-NEXT: subl %edx, %eax +; X64-NEXT: subl %ecx, %eax ; X64-NEXT: shrl %eax -; X64-NEXT: imull %ecx, %eax +; X64-NEXT: imull %edx, %eax ; X64-NEXT: addl %edi, %eax ; X64-NEXT: retq ; @@ -189,17 +186,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl (%eax), %eax -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %eax, %ecx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB3_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB3_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB3_3 -; X86-NEXT: .LBB3_1: +; X86-NEXT: movl $-1, %edx ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB3_3 +; X86-NEXT: .LBB3_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB3_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: shrl %eax @@ -224,16 +220,16 @@ ; X64: # %bb.0: ; X64-NEXT: movl (%rdi), %ecx ; X64-NEXT: movl (%rsi), %eax -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpl %eax, %ecx -; X64-NEXT: setle %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx -; X64-NEXT: movl %ecx, %esi -; X64-NEXT: cmovgl %eax, %esi +; X64-NEXT: movl $1, %edx +; X64-NEXT: movl $-1, %esi +; X64-NEXT: cmovlel %edx, %esi +; X64-NEXT: movl %ecx, %edx +; X64-NEXT: cmovgl %eax, %edx ; X64-NEXT: cmovgl %ecx, %eax -; X64-NEXT: subl %esi, %eax +; X64-NEXT: subl %edx, %eax ; X64-NEXT: shrl %eax -; X64-NEXT: imull %edx, %eax +; X64-NEXT: imull %esi, %eax ; X64-NEXT: addl %ecx, %eax ; X64-NEXT: retq ; @@ -244,17 +240,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl (%ecx), %ecx ; X86-NEXT: movl (%eax), %eax -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %eax, %ecx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB4_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB4_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB4_3 -; X86-NEXT: .LBB4_1: +; X86-NEXT: movl $-1, %edx ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB4_3 +; X86-NEXT: .LBB4_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB4_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: shrl %eax @@ -284,10 +279,10 @@ define i64 @scalar_i64_signed_reg_reg(i64 %a1, i64 %a2) nounwind { ; X64-LABEL: scalar_i64_signed_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rsi, %rdi -; X64-NEXT: setle %al -; X64-NEXT: leaq -1(%rax,%rax), %rax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movq $-1, %rax +; X64-NEXT: cmovleq %rcx, %rax ; X64-NEXT: movq %rdi, %rcx ; X64-NEXT: cmovgq %rsi, %rcx ; X64-NEXT: cmovgq %rdi, %rsi @@ -354,10 +349,10 @@ define i64 @scalar_i64_unsigned_reg_reg(i64 %a1, i64 %a2) nounwind { ; X64-LABEL: scalar_i64_unsigned_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rsi, %rdi -; X64-NEXT: setbe %al -; X64-NEXT: leaq -1(%rax,%rax), %rax +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movq $-1, %rax +; X64-NEXT: cmovbeq %rcx, %rax ; X64-NEXT: movq %rdi, %rcx ; X64-NEXT: cmovaq %rsi, %rcx ; X64-NEXT: cmovaq %rdi, %rsi @@ -427,10 +422,10 @@ ; X64-LABEL: scalar_i64_signed_mem_reg: ; X64: # %bb.0: ; X64-NEXT: movq (%rdi), %rcx -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rsi, %rcx -; X64-NEXT: setle %al -; X64-NEXT: leaq -1(%rax,%rax), %rax +; X64-NEXT: movl $1, %edx +; X64-NEXT: movq $-1, %rax +; X64-NEXT: cmovleq %rdx, %rax ; X64-NEXT: movq %rcx, %rdx ; X64-NEXT: cmovgq %rsi, %rdx ; X64-NEXT: cmovgq %rcx, %rsi @@ -503,16 +498,16 @@ ; X64-LABEL: scalar_i64_signed_reg_mem: ; X64: # %bb.0: ; X64-NEXT: movq (%rsi), %rax -; X64-NEXT: xorl %ecx, %ecx ; X64-NEXT: cmpq %rax, %rdi -; X64-NEXT: setle %cl -; X64-NEXT: leaq -1(%rcx,%rcx), %rcx -; X64-NEXT: movq %rdi, %rdx -; X64-NEXT: cmovgq %rax, %rdx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movq $-1, %rdx +; X64-NEXT: cmovleq %rcx, %rdx +; X64-NEXT: movq %rdi, %rcx +; X64-NEXT: cmovgq %rax, %rcx ; X64-NEXT: cmovgq %rdi, %rax -; X64-NEXT: subq %rdx, %rax +; X64-NEXT: subq %rcx, %rax ; X64-NEXT: shrq %rax -; X64-NEXT: imulq %rcx, %rax +; X64-NEXT: imulq %rdx, %rax ; X64-NEXT: addq %rdi, %rax ; X64-NEXT: retq ; @@ -577,16 +572,16 @@ ; X64: # %bb.0: ; X64-NEXT: movq (%rdi), %rcx ; X64-NEXT: movq (%rsi), %rax -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rax, %rcx -; X64-NEXT: setle %dl -; X64-NEXT: leaq -1(%rdx,%rdx), %rdx -; X64-NEXT: movq %rcx, %rsi -; X64-NEXT: cmovgq %rax, %rsi +; X64-NEXT: movl $1, %edx +; X64-NEXT: movq $-1, %rsi +; X64-NEXT: cmovleq %rdx, %rsi +; X64-NEXT: movq %rcx, %rdx +; X64-NEXT: cmovgq %rax, %rdx ; X64-NEXT: cmovgq %rcx, %rax -; X64-NEXT: subq %rsi, %rax +; X64-NEXT: subq %rdx, %rax ; X64-NEXT: shrq %rax -; X64-NEXT: imulq %rdx, %rax +; X64-NEXT: imulq %rsi, %rax ; X64-NEXT: addq %rcx, %rax ; X64-NEXT: retq ; @@ -660,10 +655,10 @@ define i16 @scalar_i16_signed_reg_reg(i16 %a1, i16 %a2) nounwind { ; X64-LABEL: scalar_i16_signed_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpw %si, %di -; X64-NEXT: setle %al -; X64-NEXT: leal -1(%rax,%rax), %ecx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $65535, %ecx # imm = 0xFFFF +; X64-NEXT: cmovlel %eax, %ecx ; X64-NEXT: movl %edi, %eax ; X64-NEXT: cmovgl %esi, %eax ; X64-NEXT: cmovgl %edi, %esi @@ -680,17 +675,16 @@ ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpw %ax, %cx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB10_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB10_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB10_3 -; X86-NEXT: .LBB10_1: +; X86-NEXT: movl $65535, %edx # imm = 0xFFFF ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB10_3 +; X86-NEXT: .LBB10_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB10_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: movzwl %ax, %eax @@ -714,10 +708,10 @@ define i16 @scalar_i16_unsigned_reg_reg(i16 %a1, i16 %a2) nounwind { ; X64-LABEL: scalar_i16_unsigned_reg_reg: ; X64: # %bb.0: -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpw %si, %di -; X64-NEXT: setbe %al -; X64-NEXT: leal -1(%rax,%rax), %ecx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $65535, %ecx # imm = 0xFFFF +; X64-NEXT: cmovbel %eax, %ecx ; X64-NEXT: movl %edi, %eax ; X64-NEXT: cmoval %esi, %eax ; X64-NEXT: cmoval %edi, %esi @@ -734,17 +728,16 @@ ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpw %ax, %cx -; X86-NEXT: setbe %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: ja .LBB11_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jbe .LBB11_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB11_3 -; X86-NEXT: .LBB11_1: +; X86-NEXT: movl $65535, %edx # imm = 0xFFFF ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB11_3 +; X86-NEXT: .LBB11_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB11_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: movzwl %ax, %eax @@ -771,10 +764,10 @@ ; X64-LABEL: scalar_i16_signed_mem_reg: ; X64: # %bb.0: ; X64-NEXT: movzwl (%rdi), %ecx -; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpw %si, %cx -; X64-NEXT: setle %al -; X64-NEXT: leal -1(%rax,%rax), %edx +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $65535, %edx # imm = 0xFFFF +; X64-NEXT: cmovlel %eax, %edx ; X64-NEXT: movl %ecx, %eax ; X64-NEXT: cmovgl %esi, %eax ; X64-NEXT: cmovgl %ecx, %esi @@ -792,17 +785,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movzwl (%ecx), %ecx -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpw %ax, %cx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB12_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB12_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB12_3 -; X86-NEXT: .LBB12_1: +; X86-NEXT: movl $65535, %edx # imm = 0xFFFF ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB12_3 +; X86-NEXT: .LBB12_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB12_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: movzwl %ax, %eax @@ -828,17 +820,17 @@ ; X64-LABEL: scalar_i16_signed_reg_mem: ; X64: # %bb.0: ; X64-NEXT: movzwl (%rsi), %eax -; X64-NEXT: xorl %ecx, %ecx ; X64-NEXT: cmpw %ax, %di -; X64-NEXT: setle %cl -; X64-NEXT: leal -1(%rcx,%rcx), %ecx -; X64-NEXT: movl %edi, %edx -; X64-NEXT: cmovgl %eax, %edx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $65535, %edx # imm = 0xFFFF +; X64-NEXT: cmovlel %ecx, %edx +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: cmovgl %eax, %ecx ; X64-NEXT: cmovgl %edi, %eax -; X64-NEXT: subl %edx, %eax +; X64-NEXT: subl %ecx, %eax ; X64-NEXT: movzwl %ax, %eax ; X64-NEXT: shrl %eax -; X64-NEXT: imull %ecx, %eax +; X64-NEXT: imull %edx, %eax ; X64-NEXT: addl %edi, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -849,17 +841,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movzwl (%eax), %eax -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpw %ax, %cx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB13_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB13_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB13_3 -; X86-NEXT: .LBB13_1: +; X86-NEXT: movl $65535, %edx # imm = 0xFFFF ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB13_3 +; X86-NEXT: .LBB13_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB13_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: movzwl %ax, %eax @@ -886,17 +877,17 @@ ; X64: # %bb.0: ; X64-NEXT: movzwl (%rdi), %ecx ; X64-NEXT: movzwl (%rsi), %eax -; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpw %ax, %cx -; X64-NEXT: setle %dl -; X64-NEXT: leal -1(%rdx,%rdx), %edx -; X64-NEXT: movl %ecx, %esi -; X64-NEXT: cmovgl %eax, %esi +; X64-NEXT: movl $1, %edx +; X64-NEXT: movl $65535, %esi # imm = 0xFFFF +; X64-NEXT: cmovlel %edx, %esi +; X64-NEXT: movl %ecx, %edx +; X64-NEXT: cmovgl %eax, %edx ; X64-NEXT: cmovgl %ecx, %eax -; X64-NEXT: subl %esi, %eax +; X64-NEXT: subl %edx, %eax ; X64-NEXT: movzwl %ax, %eax ; X64-NEXT: shrl %eax -; X64-NEXT: imull %edx, %eax +; X64-NEXT: imull %esi, %eax ; X64-NEXT: addl %ecx, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -908,17 +899,16 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movzwl (%ecx), %ecx ; X86-NEXT: movzwl (%eax), %eax -; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpw %ax, %cx -; X86-NEXT: setle %dl -; X86-NEXT: leal -1(%edx,%edx), %edx -; X86-NEXT: jg .LBB14_1 +; X86-NEXT: movl $1, %edx +; X86-NEXT: jle .LBB14_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movl %ecx, %esi -; X86-NEXT: jmp .LBB14_3 -; X86-NEXT: .LBB14_1: +; X86-NEXT: movl $65535, %edx # imm = 0xFFFF ; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl %ecx, %eax +; X86-NEXT: jmp .LBB14_3 +; X86-NEXT: .LBB14_1: +; X86-NEXT: movl %ecx, %esi ; X86-NEXT: .LBB14_3: ; X86-NEXT: subl %esi, %eax ; X86-NEXT: movzwl %ax, %eax @@ -952,16 +942,16 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: cmpb %al, %dil -; X64-NEXT: setle %cl -; X64-NEXT: movl %edi, %edx -; X64-NEXT: cmovgl %esi, %edx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $255, %edx +; X64-NEXT: cmovlel %ecx, %edx +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: cmovgl %esi, %ecx ; X64-NEXT: cmovgl %edi, %eax -; X64-NEXT: addb %cl, %cl -; X64-NEXT: decb %cl -; X64-NEXT: subb %dl, %al +; X64-NEXT: subb %cl, %al ; X64-NEXT: shrb %al ; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: mulb %cl +; X64-NEXT: mulb %dl ; X64-NEXT: addb %dil, %al ; X64-NEXT: retq ; @@ -970,18 +960,17 @@ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: cmpb %al, %cl -; X86-NEXT: setle %dl -; X86-NEXT: jg .LBB15_1 +; X86-NEXT: movb $1, %dl +; X86-NEXT: jle .LBB15_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movb %cl, %ah -; X86-NEXT: jmp .LBB15_3 -; X86-NEXT: .LBB15_1: +; X86-NEXT: movb $-1, %dl ; X86-NEXT: movb %al, %ah ; X86-NEXT: movb %cl, %al +; X86-NEXT: jmp .LBB15_3 +; X86-NEXT: .LBB15_1: +; X86-NEXT: movb %cl, %ah ; X86-NEXT: .LBB15_3: ; X86-NEXT: subb %ah, %al -; X86-NEXT: addb %dl, %dl -; X86-NEXT: decb %dl ; X86-NEXT: shrb %al ; X86-NEXT: mulb %dl ; X86-NEXT: addb %cl, %al @@ -1002,16 +991,16 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: cmpb %al, %dil -; X64-NEXT: setbe %cl -; X64-NEXT: movl %edi, %edx -; X64-NEXT: cmoval %esi, %edx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $255, %edx +; X64-NEXT: cmovbel %ecx, %edx +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: cmoval %esi, %ecx ; X64-NEXT: cmoval %edi, %eax -; X64-NEXT: addb %cl, %cl -; X64-NEXT: decb %cl -; X64-NEXT: subb %dl, %al +; X64-NEXT: subb %cl, %al ; X64-NEXT: shrb %al ; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: mulb %cl +; X64-NEXT: mulb %dl ; X64-NEXT: addb %dil, %al ; X64-NEXT: retq ; @@ -1020,18 +1009,17 @@ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: cmpb %al, %cl -; X86-NEXT: setbe %dl -; X86-NEXT: ja .LBB16_1 +; X86-NEXT: movb $1, %dl +; X86-NEXT: jbe .LBB16_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movb %cl, %ah -; X86-NEXT: jmp .LBB16_3 -; X86-NEXT: .LBB16_1: +; X86-NEXT: movb $-1, %dl ; X86-NEXT: movb %al, %ah ; X86-NEXT: movb %cl, %al +; X86-NEXT: jmp .LBB16_3 +; X86-NEXT: .LBB16_1: +; X86-NEXT: movb %cl, %ah ; X86-NEXT: .LBB16_3: ; X86-NEXT: subb %ah, %al -; X86-NEXT: addb %dl, %dl -; X86-NEXT: decb %dl ; X86-NEXT: shrb %al ; X86-NEXT: mulb %dl ; X86-NEXT: addb %cl, %al @@ -1054,13 +1042,13 @@ ; X64: # %bb.0: ; X64-NEXT: movzbl (%rdi), %ecx ; X64-NEXT: cmpb %sil, %cl -; X64-NEXT: setle %dl +; X64-NEXT: movl $1, %eax +; X64-NEXT: movl $255, %edx +; X64-NEXT: cmovlel %eax, %edx ; X64-NEXT: movl %ecx, %edi ; X64-NEXT: cmovgl %esi, %edi ; X64-NEXT: movl %ecx, %eax ; X64-NEXT: cmovlel %esi, %eax -; X64-NEXT: addb %dl, %dl -; X64-NEXT: decb %dl ; X64-NEXT: subb %dil, %al ; X64-NEXT: shrb %al ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -1074,18 +1062,17 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movzbl (%ecx), %ecx ; X86-NEXT: cmpb %al, %cl -; X86-NEXT: setle %dl -; X86-NEXT: jg .LBB17_1 +; X86-NEXT: movb $1, %dl +; X86-NEXT: jle .LBB17_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movb %cl, %ah -; X86-NEXT: jmp .LBB17_3 -; X86-NEXT: .LBB17_1: +; X86-NEXT: movb $-1, %dl ; X86-NEXT: movb %al, %ah ; X86-NEXT: movb %cl, %al +; X86-NEXT: jmp .LBB17_3 +; X86-NEXT: .LBB17_1: +; X86-NEXT: movb %cl, %ah ; X86-NEXT: .LBB17_3: ; X86-NEXT: subb %ah, %al -; X86-NEXT: addb %dl, %dl -; X86-NEXT: decb %dl ; X86-NEXT: shrb %al ; X86-NEXT: mulb %dl ; X86-NEXT: addb %cl, %al @@ -1107,16 +1094,16 @@ ; X64: # %bb.0: ; X64-NEXT: movzbl (%rsi), %eax ; X64-NEXT: cmpb %al, %dil -; X64-NEXT: setle %cl -; X64-NEXT: movl %edi, %edx -; X64-NEXT: cmovgl %eax, %edx +; X64-NEXT: movl $1, %ecx +; X64-NEXT: movl $255, %edx +; X64-NEXT: cmovlel %ecx, %edx +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: cmovgl %eax, %ecx ; X64-NEXT: cmovgl %edi, %eax -; X64-NEXT: addb %cl, %cl -; X64-NEXT: decb %cl -; X64-NEXT: subb %dl, %al +; X64-NEXT: subb %cl, %al ; X64-NEXT: shrb %al ; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: mulb %cl +; X64-NEXT: mulb %dl ; X64-NEXT: addb %dil, %al ; X64-NEXT: retq ; @@ -1126,18 +1113,17 @@ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movzbl (%eax), %eax ; X86-NEXT: cmpb %al, %cl -; X86-NEXT: setle %dl -; X86-NEXT: jg .LBB18_1 +; X86-NEXT: movb $1, %dl +; X86-NEXT: jle .LBB18_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movb %cl, %ah -; X86-NEXT: jmp .LBB18_3 -; X86-NEXT: .LBB18_1: +; X86-NEXT: movb $-1, %dl ; X86-NEXT: movb %al, %ah ; X86-NEXT: movb %cl, %al +; X86-NEXT: jmp .LBB18_3 +; X86-NEXT: .LBB18_1: +; X86-NEXT: movb %cl, %ah ; X86-NEXT: .LBB18_3: ; X86-NEXT: subb %ah, %al -; X86-NEXT: addb %dl, %dl -; X86-NEXT: decb %dl ; X86-NEXT: shrb %al ; X86-NEXT: mulb %dl ; X86-NEXT: addb %cl, %al @@ -1160,16 +1146,16 @@ ; X64-NEXT: movzbl (%rdi), %ecx ; X64-NEXT: movzbl (%rsi), %eax ; X64-NEXT: cmpb %al, %cl -; X64-NEXT: setle %dl -; X64-NEXT: movl %ecx, %esi -; X64-NEXT: cmovgl %eax, %esi +; X64-NEXT: movl $1, %edx +; X64-NEXT: movl $255, %esi +; X64-NEXT: cmovlel %edx, %esi +; X64-NEXT: movl %ecx, %edx +; X64-NEXT: cmovgl %eax, %edx ; X64-NEXT: cmovgl %ecx, %eax -; X64-NEXT: addb %dl, %dl -; X64-NEXT: decb %dl -; X64-NEXT: subb %sil, %al +; X64-NEXT: subb %dl, %al ; X64-NEXT: shrb %al ; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: mulb %dl +; X64-NEXT: mulb %sil ; X64-NEXT: addb %cl, %al ; X64-NEXT: retq ; @@ -1180,18 +1166,17 @@ ; X86-NEXT: movzbl (%ecx), %ecx ; X86-NEXT: movzbl (%eax), %eax ; X86-NEXT: cmpb %al, %cl -; X86-NEXT: setle %dl -; X86-NEXT: jg .LBB19_1 +; X86-NEXT: movb $1, %dl +; X86-NEXT: jle .LBB19_1 ; X86-NEXT: # %bb.2: -; X86-NEXT: movb %cl, %ah -; X86-NEXT: jmp .LBB19_3 -; X86-NEXT: .LBB19_1: +; X86-NEXT: movb $-1, %dl ; X86-NEXT: movb %al, %ah ; X86-NEXT: movb %cl, %al +; X86-NEXT: jmp .LBB19_3 +; X86-NEXT: .LBB19_1: +; X86-NEXT: movb %cl, %ah ; X86-NEXT: .LBB19_3: ; X86-NEXT: subb %ah, %al -; X86-NEXT: addb %dl, %dl -; X86-NEXT: decb %dl ; X86-NEXT: shrb %al ; X86-NEXT: mulb %dl ; X86-NEXT: addb %cl, %al diff --git a/llvm/test/CodeGen/X86/select-1-or-neg1.ll b/llvm/test/CodeGen/X86/select-1-or-neg1.ll --- a/llvm/test/CodeGen/X86/select-1-or-neg1.ll +++ b/llvm/test/CodeGen/X86/select-1-or-neg1.ll @@ -8,19 +8,16 @@ define i32 @PR28968(i32 %x) { ; BASE-LABEL: PR28968: ; BASE: # %bb.0: -; BASE-NEXT: xorl %eax, %eax ; BASE-NEXT: cmpl $1, %edi -; BASE-NEXT: sete %al -; BASE-NEXT: leal -1(%rax,%rax), %eax +; BASE-NEXT: movl $-1, %eax +; BASE-NEXT: cmovel %edi, %eax ; BASE-NEXT: retq ; ; SLOWLEA3-LABEL: PR28968: ; SLOWLEA3: # %bb.0: -; SLOWLEA3-NEXT: xorl %eax, %eax ; SLOWLEA3-NEXT: cmpl $1, %edi -; SLOWLEA3-NEXT: sete %al -; SLOWLEA3-NEXT: addl %eax, %eax -; SLOWLEA3-NEXT: decl %eax +; SLOWLEA3-NEXT: movl $-1, %eax +; SLOWLEA3-NEXT: cmovel %edi, %eax ; SLOWLEA3-NEXT: retq %cmp = icmp eq i32 %x, 1 %sel = select i1 %cmp, i32 1, i32 -1 diff --git a/llvm/test/CodeGen/X86/select_const.ll b/llvm/test/CodeGen/X86/select_const.ll --- a/llvm/test/CodeGen/X86/select_const.ll +++ b/llvm/test/CodeGen/X86/select_const.ll @@ -207,8 +207,9 @@ ; CHECK-LABEL: select_lea_2: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: leal -1(%rax,%rax), %eax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -1, i32 1 ret i32 %sel @@ -218,8 +219,9 @@ ; CHECK-LABEL: select_lea_3: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: leaq -2(%rax,%rax,2), %rax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movq $-2, %rax +; CHECK-NEXT: cmovneq %rcx, %rax ; CHECK-NEXT: retq %sel = select i1 %cond, i64 -2, i64 1 ret i64 %sel @@ -229,8 +231,9 @@ ; CHECK-LABEL: select_lea_5: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: leal -2(%rax,%rax,4), %eax +; CHECK-NEXT: movl $3, %ecx +; CHECK-NEXT: movl $-2, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -2, i32 3 ret i32 %sel @@ -240,8 +243,9 @@ ; CHECK-LABEL: select_lea_9: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: leaq -7(%rax,%rax,8), %rax +; CHECK-NEXT: movl $2, %ecx +; CHECK-NEXT: movq $-7, %rax +; CHECK-NEXT: cmovneq %rcx, %rax ; CHECK-NEXT: retq %sel = select i1 %cond, i64 -7, i64 2 ret i64 %sel @@ -268,9 +272,10 @@ ; CHECK-LABEL: sel_1_neg1: ; CHECK: # %bb.0: ; CHECK-NEXT: cmpl $43, %edi -; CHECK-NEXT: setge %al -; CHECK-NEXT: shlb $2, %al -; CHECK-NEXT: decb %al +; CHECK-NEXT: movl $3, %ecx +; CHECK-NEXT: movl $255, %eax +; CHECK-NEXT: cmovgel %ecx, %eax +; CHECK-NEXT: # kill: def $al killed $al killed $eax ; CHECK-NEXT: retq %cmp = icmp sgt i32 %x, 42 %sel = select i1 %cmp, i8 3, i8 -1 @@ -282,10 +287,10 @@ define i16 @sel_neg1_1(i32 %x) { ; CHECK-LABEL: sel_neg1_1: ; CHECK: # %bb.0: -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpl $43, %edi -; CHECK-NEXT: setl %al -; CHECK-NEXT: leal -1(,%rax,4), %eax +; CHECK-NEXT: movl $3, %ecx +; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF +; CHECK-NEXT: cmovll %ecx, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq %cmp = icmp sgt i32 %x, 42 @@ -298,10 +303,10 @@ define i32 @sel_1_neg1_32(i32 %x) { ; CHECK-LABEL: sel_1_neg1_32: ; CHECK: # %bb.0: -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpl $43, %edi -; CHECK-NEXT: setge %al -; CHECK-NEXT: leal -1(%rax,%rax,8), %eax +; CHECK-NEXT: movl $8, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovgel %ecx, %eax ; CHECK-NEXT: retq %cmp = icmp sgt i32 %x, 42 %sel = select i1 %cmp, i32 8, i32 -1 @@ -311,10 +316,10 @@ define i32 @sel_neg1_1_32(i32 %x) { ; CHECK-LABEL: sel_neg1_1_32: ; CHECK: # %bb.0: -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpl $43, %edi -; CHECK-NEXT: setl %al -; CHECK-NEXT: leal -7(%rax,%rax,8), %eax +; CHECK-NEXT: movl $2, %ecx +; CHECK-NEXT: movl $-7, %eax +; CHECK-NEXT: cmovll %ecx, %eax ; CHECK-NEXT: retq %cmp = icmp sgt i32 %x, 42 %sel = select i1 %cmp, i32 -7, i32 2 @@ -328,9 +333,10 @@ define i8 @select_pow2_diff(i1 zeroext %cond) { ; CHECK-LABEL: select_pow2_diff: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: shlb $4, %dil -; CHECK-NEXT: leal 3(%rdi), %eax +; CHECK-NEXT: testl %edi, %edi +; CHECK-NEXT: movl $19, %ecx +; CHECK-NEXT: movl $3, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: # kill: def $al killed $al killed $eax ; CHECK-NEXT: retq %sel = select i1 %cond, i8 19, i8 3 @@ -341,9 +347,9 @@ ; CHECK-LABEL: select_pow2_diff_invert: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: shll $6, %eax -; CHECK-NEXT: orl $7, %eax +; CHECK-NEXT: movl $71, %ecx +; CHECK-NEXT: movl $7, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq %sel = select i1 %cond, i16 7, i16 71 @@ -353,9 +359,10 @@ define i32 @select_pow2_diff_neg(i1 zeroext %cond) { ; CHECK-LABEL: select_pow2_diff_neg: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: shll $4, %edi -; CHECK-NEXT: leal -25(%rdi), %eax +; CHECK-NEXT: testl %edi, %edi +; CHECK-NEXT: movl $-9, %ecx +; CHECK-NEXT: movl $-25, %eax +; CHECK-NEXT: cmovnel %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -9, i32 -25 ret i32 %sel @@ -365,9 +372,9 @@ ; CHECK-LABEL: select_pow2_diff_neg_invert: ; CHECK: # %bb.0: ; CHECK-NEXT: xorb $1, %dil -; CHECK-NEXT: movzbl %dil, %eax -; CHECK-NEXT: shlq $7, %rax -; CHECK-NEXT: addq $-99, %rax +; CHECK-NEXT: movl $29, %ecx +; CHECK-NEXT: movq $-99, %rax +; CHECK-NEXT: cmovneq %rcx, %rax ; CHECK-NEXT: retq %sel = select i1 %cond, i64 -99, i64 29 ret i64 %sel diff --git a/llvm/test/CodeGen/X86/shift-parts.ll b/llvm/test/CodeGen/X86/shift-parts.ll --- a/llvm/test/CodeGen/X86/shift-parts.ll +++ b/llvm/test/CodeGen/X86/shift-parts.ll @@ -11,15 +11,17 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movq g_144+24(%rip), %rax ; CHECK-NEXT: movq g_144+16(%rip), %rcx -; CHECK-NEXT: movzbl %sil, %edx -; CHECK-NEXT: shll $6, %edx ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB0_1: # %for.cond ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: testb $64, %dl -; CHECK-NEXT: movq %rcx, %rsi -; CHECK-NEXT: cmovneq %rax, %rsi -; CHECK-NEXT: testl %esi, %esi +; CHECK-NEXT: xorl %edx, %edx +; CHECK-NEXT: testb $1, %sil +; CHECK-NEXT: setne %dl +; CHECK-NEXT: shll $6, %edx +; CHECK-NEXT: testb %dl, %dl +; CHECK-NEXT: movq %rcx, %rdx +; CHECK-NEXT: cmovneq %rax, %rdx +; CHECK-NEXT: testl %edx, %edx ; CHECK-NEXT: je .LBB0_1 ; CHECK-NEXT: # %bb.2: # %if.then ; CHECK-NEXT: movl $1, %eax diff --git a/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll b/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll --- a/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll +++ b/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll @@ -3330,10 +3330,10 @@ ; CHECK-NEXT: #APP ; CHECK-NEXT: nop ; CHECK-NEXT: #NO_APP -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: vucomisd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload -; CHECK-NEXT: sete %al -; CHECK-NEXT: leal -1(%rax,%rax), %eax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovel %ecx, %eax ; CHECK-NEXT: retq %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = fcmp ueq double %a0, %a1 @@ -3367,10 +3367,10 @@ ; CHECK-NEXT: #APP ; CHECK-NEXT: nop ; CHECK-NEXT: #NO_APP -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: vucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload -; CHECK-NEXT: sete %al -; CHECK-NEXT: leal -1(%rax,%rax), %eax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovel %ecx, %eax ; CHECK-NEXT: retq %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = fcmp ueq float %a0, %a1 diff --git a/llvm/test/CodeGen/X86/stack-folding-fp-sse42.ll b/llvm/test/CodeGen/X86/stack-folding-fp-sse42.ll --- a/llvm/test/CodeGen/X86/stack-folding-fp-sse42.ll +++ b/llvm/test/CodeGen/X86/stack-folding-fp-sse42.ll @@ -2303,10 +2303,10 @@ ; CHECK-NEXT: #APP ; CHECK-NEXT: nop ; CHECK-NEXT: #NO_APP -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: ucomisd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload -; CHECK-NEXT: sete %al -; CHECK-NEXT: leal -1(%rax,%rax), %eax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovel %ecx, %eax ; CHECK-NEXT: retq %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = fcmp ueq double %a0, %a1 @@ -2340,10 +2340,10 @@ ; CHECK-NEXT: #APP ; CHECK-NEXT: nop ; CHECK-NEXT: #NO_APP -; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload -; CHECK-NEXT: sete %al -; CHECK-NEXT: leal -1(%rax,%rax), %eax +; CHECK-NEXT: movl $1, %ecx +; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: cmovel %ecx, %eax ; CHECK-NEXT: retq %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = fcmp ueq float %a0, %a1 diff --git a/llvm/test/CodeGen/X86/zext-sext.ll b/llvm/test/CodeGen/X86/zext-sext.ll --- a/llvm/test/CodeGen/X86/zext-sext.ll +++ b/llvm/test/CodeGen/X86/zext-sext.ll @@ -16,17 +16,16 @@ ; CHECK-NEXT: movq (%rdx), %rax ; CHECK-NEXT: movswl 8(%rdi), %edx ; CHECK-NEXT: movswl (%rax,%rsi,2), %eax -; CHECK-NEXT: movl $1, %esi +; CHECK-NEXT: movl $-1, %esi ; CHECK-NEXT: imull %edx, %eax -; CHECK-NEXT: xorl %edx, %edx +; CHECK-NEXT: movl $1, %edx ; CHECK-NEXT: addl $2138875574, %eax # imm = 0x7F7CA6B6 ; CHECK-NEXT: cmpl $-8608074, %eax # imm = 0xFF7CA6B6 ; CHECK-NEXT: movslq %eax, %rdi -; CHECK-NEXT: setl %dl +; CHECK-NEXT: cmovll %edx, %esi ; CHECK-NEXT: cmpl $2138875574, %eax # imm = 0x7F7CA6B6 ; CHECK-NEXT: movq %rdi, %r8 -; CHECK-NEXT: leal -1(%rdx,%rdx), %edx -; CHECK-NEXT: cmovll %edx, %esi +; CHECK-NEXT: cmovgel %edx, %esi ; CHECK-NEXT: subq %rax, %r8 ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpl $1, %esi