diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 9b08ec5bcb73a..1d2d90d543c05 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -52011,22 +52011,32 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG, if (SDValue R = combineLogicBlendIntoPBLENDV(N, dl, DAG, Subtarget)) return R; - // (0 - SetCC) | C -> (zext (not SetCC)) * (C + 1) - 1 if we can get a LEA out of it. - if ((VT == MVT::i32 || VT == MVT::i64) && - N0.getOpcode() == ISD::SUB && N0.hasOneUse() && - isNullConstant(N0.getOperand(0))) { - SDValue Cond = N0.getOperand(1); - if (Cond.getOpcode() == ISD::ZERO_EXTEND && Cond.hasOneUse()) - Cond = Cond.getOperand(0); - - if (Cond.getOpcode() == X86ISD::SETCC && Cond.hasOneUse()) { - if (auto *CN = dyn_cast(N1)) { - uint64_t Val = CN->getZExtValue(); - if (Val == 1 || Val == 2 || Val == 3 || Val == 4 || Val == 7 || Val == 8) { - X86::CondCode CCode = (X86::CondCode)Cond.getConstantOperandVal(0); - CCode = X86::GetOppositeBranchCondition(CCode); - SDValue NotCond = getSETCC(CCode, Cond.getOperand(1), SDLoc(Cond), DAG); + // Combine `(x86isd::setcc_carry) | C` and `(0 - SetCC) | C` + // into `(zext (not SetCC)) * (C + 1) - 1` if we can get a LEA out of it. + if ((VT == MVT::i32 || VT == MVT::i64) && N0.hasOneUse()) { + if (auto *CN = dyn_cast(N1)) { + uint64_t Val = CN->getZExtValue(); + if (Val == 1 || Val == 2 || Val == 3 || Val == 4 || Val == 7 || + Val == 8) { + SDValue NotCond; + if (N0.getOpcode() == X86ISD::SETCC_CARRY && + N0.getOperand(1).hasOneUse()) { + X86::CondCode OldCC = (X86::CondCode)N0.getConstantOperandVal(0); + X86::CondCode NewCC = X86::GetOppositeBranchCondition(OldCC); + NotCond = getSETCC(NewCC, N0.getOperand(1), SDLoc(N0), DAG); + } else if (N0.getOpcode() == ISD::SUB && + isNullConstant(N0.getOperand(0))) { + SDValue Cond = N0.getOperand(1); + if (Cond.getOpcode() == ISD::ZERO_EXTEND && Cond.hasOneUse()) + Cond = Cond.getOperand(0); + if (Cond.getOpcode() == X86ISD::SETCC && Cond.hasOneUse()) { + X86::CondCode OldCC = (X86::CondCode)Cond.getConstantOperandVal(0); + X86::CondCode NewCC = X86::GetOppositeBranchCondition(OldCC); + NotCond = getSETCC(NewCC, Cond.getOperand(1), SDLoc(Cond), DAG); + } + } + if (NotCond) { SDValue R = DAG.getZExtOrTrunc(NotCond, dl, VT); R = DAG.getNode(ISD::MUL, dl, VT, R, DAG.getConstant(Val + 1, dl, VT)); R = DAG.getNode(ISD::SUB, dl, VT, R, DAG.getConstant(1, dl, VT)); diff --git a/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll b/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll index 62935f7e372b3..7d1422d3c961e 100644 --- a/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll @@ -159,10 +159,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind { ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpw %si, %dx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind @@ -284,10 +283,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind { ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB16_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind @@ -330,10 +328,9 @@ define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB18_2 ; X86-NEXT: .LBB18_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB18_2: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -367,8 +364,8 @@ define i32 @length7(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB19_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB19_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -416,8 +413,8 @@ define i1 @length7_lt(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB21_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB21_3: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -451,8 +448,8 @@ define i32 @length8(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB22_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB22_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -613,8 +610,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB29_3: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB29_4: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -738,8 +735,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB33_4: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB33_5: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -852,8 +849,8 @@ define i1 @length16_lt(ptr %x, ptr %y) nounwind { ; X86-NEXT: .LBB35_4: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB35_5: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -901,8 +898,8 @@ define i1 @length16_gt(ptr %x, ptr %y) nounwind { ; X86-NEXT: .LBB36_4: # %res_block ; X86-NEXT: xorl %edx, %edx ; X86-NEXT: cmpl %ecx, %eax -; X86-NEXT: sbbl %edx, %edx -; X86-NEXT: orl $1, %edx +; X86-NEXT: setae %dl +; X86-NEXT: leal -1(%edx,%edx), %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 index 9bbd335a903be..3a3824a4ffe83 100644 --- a/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll +++ b/llvm/test/CodeGen/X86/memcmp-more-load-pairs.ll @@ -139,11 +139,11 @@ define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind { define i32 @length3(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length3: ; X64: # %bb.0: -; X64-NEXT: movzwl (%rdi), %ecx -; X64-NEXT: movzwl (%rsi), %edx +; X64-NEXT: movzwl (%rdi), %eax +; X64-NEXT: movzwl (%rsi), %ecx +; X64-NEXT: rolw $8, %ax ; X64-NEXT: rolw $8, %cx -; X64-NEXT: rolw $8, %dx -; X64-NEXT: cmpw %dx, %cx +; X64-NEXT: cmpw %cx, %ax ; X64-NEXT: jne .LBB9_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 2(%rdi), %eax @@ -151,10 +151,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpw %dx, %cx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -248,11 +247,11 @@ define i1 @length4_eq_const(ptr %X) nounwind { define i32 @length5(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length5: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB16_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -260,10 +259,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB16_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -288,11 +286,11 @@ define i1 @length5_eq(ptr %X, ptr %Y) nounwind { define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length5_lt: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB18_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -302,10 +300,9 @@ define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq ; X64-NEXT: .LBB18_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -334,8 +331,8 @@ define i32 @length7(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB19_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB19_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind @@ -377,8 +374,8 @@ define i1 @length7_lt(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB21_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB21_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -510,8 +507,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB29_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB29_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -585,8 +582,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB33_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB33_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind @@ -655,8 +652,8 @@ define i1 @length16_lt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB35_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB35_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -686,8 +683,8 @@ define i1 @length16_gt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB36_2: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %edx ; X64-NEXT: .LBB36_3: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -766,8 +763,8 @@ define i32 @length24(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB38_3: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB38_4: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind @@ -858,8 +855,8 @@ define i1 @length24_lt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB40_3: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB40_4: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -896,8 +893,8 @@ define i1 @length24_gt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB41_3: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %edx ; X64-NEXT: .LBB41_4: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -993,8 +990,8 @@ define i32 @length31(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB43_4: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB43_5: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind @@ -1091,8 +1088,8 @@ define i1 @length31_lt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB45_4: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB45_5: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -1136,8 +1133,8 @@ define i1 @length31_gt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB46_4: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %edx ; X64-NEXT: .LBB46_5: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -1289,8 +1286,8 @@ define i32 @length32(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB49_4: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB49_5: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind @@ -1402,8 +1399,8 @@ define i1 @length32_lt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB51_4: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB51_5: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -1447,8 +1444,8 @@ define i1 @length32_gt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB52_4: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %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 index 3a16ab656b11f..09f02c3f56346 100644 --- a/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-optsize-x32.ll @@ -87,10 +87,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind optsize { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB4_2 ; X86-NEXT: .LBB4_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpw %si, %dx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB4_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -178,10 +177,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind optsize { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB9_2 ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB9_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -230,8 +228,8 @@ define i32 @length8(ptr %X, ptr %Y) nounwind optsize { ; X86-NEXT: .LBB11_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %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 index 0f817b2c727c3..4fe67fa0883de 100644 --- a/llvm/test/CodeGen/X86/memcmp-optsize.ll +++ b/llvm/test/CodeGen/X86/memcmp-optsize.ll @@ -67,11 +67,11 @@ define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind optsize { define i32 @length3(ptr %X, ptr %Y) nounwind optsize { ; X64-LABEL: length3: ; X64: # %bb.0: -; X64-NEXT: movzwl (%rdi), %ecx -; X64-NEXT: movzwl (%rsi), %edx +; X64-NEXT: movzwl (%rdi), %eax +; X64-NEXT: movzwl (%rsi), %ecx +; X64-NEXT: rolw $8, %ax ; X64-NEXT: rolw $8, %cx -; X64-NEXT: rolw $8, %dx -; X64-NEXT: cmpw %dx, %cx +; X64-NEXT: cmpw %cx, %ax ; X64-NEXT: jne .LBB4_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 2(%rdi), %eax @@ -79,10 +79,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind optsize { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB4_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpw %dx, %cx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -146,11 +145,11 @@ define i1 @length4_eq_const(ptr %X) nounwind optsize { define i32 @length5(ptr %X, ptr %Y) nounwind optsize { ; X64-LABEL: length5: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB9_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -158,10 +157,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind optsize { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -258,8 +256,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind optsize { ; X64-NEXT: .LBB15_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB15_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -288,8 +286,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind optsize { ; X64-NEXT: .LBB16_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %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 index 35fd373536bd3..1b3fd6d4ddd3b 100644 --- a/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-pgso-x32.ll @@ -87,10 +87,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind !prof !14 { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB4_2 ; X86-NEXT: .LBB4_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpw %si, %dx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB4_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -178,10 +177,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind !prof !14 { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB9_2 ; X86-NEXT: .LBB9_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB9_2: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -230,8 +228,8 @@ define i32 @length8(ptr %X, ptr %Y) nounwind !prof !14 { ; X86-NEXT: .LBB11_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %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 index f638852923187..26ee94afbce88 100644 --- a/llvm/test/CodeGen/X86/memcmp-pgso.ll +++ b/llvm/test/CodeGen/X86/memcmp-pgso.ll @@ -67,11 +67,11 @@ define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind !prof !14 { define i32 @length3(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-LABEL: length3: ; X64: # %bb.0: -; X64-NEXT: movzwl (%rdi), %ecx -; X64-NEXT: movzwl (%rsi), %edx +; X64-NEXT: movzwl (%rdi), %eax +; X64-NEXT: movzwl (%rsi), %ecx +; X64-NEXT: rolw $8, %ax ; X64-NEXT: rolw $8, %cx -; X64-NEXT: rolw $8, %dx -; X64-NEXT: cmpw %dx, %cx +; X64-NEXT: cmpw %cx, %ax ; X64-NEXT: jne .LBB4_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 2(%rdi), %eax @@ -79,10 +79,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB4_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpw %dx, %cx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -146,11 +145,11 @@ define i1 @length4_eq_const(ptr %X) nounwind !prof !14 { define i32 @length5(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-LABEL: length5: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB9_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -158,10 +157,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB9_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -258,8 +256,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-NEXT: .LBB15_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB15_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -288,8 +286,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind !prof !14 { ; X64-NEXT: .LBB16_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %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 index 4a3f5a608e585..28e732be9191d 100644 --- a/llvm/test/CodeGen/X86/memcmp-x32.ll +++ b/llvm/test/CodeGen/X86/memcmp-x32.ll @@ -187,10 +187,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind { ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB11_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpw %si, %dx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind @@ -312,10 +311,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind { ; X86-NEXT: popl %esi ; X86-NEXT: retl ; X86-NEXT: .LBB18_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: popl %esi ; X86-NEXT: retl %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind @@ -358,10 +356,9 @@ define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X86-NEXT: subl %ecx, %eax ; X86-NEXT: jmp .LBB20_2 ; X86-NEXT: .LBB20_3: # %res_block -; X86-NEXT: xorl %eax, %eax -; X86-NEXT: cmpl %esi, %edx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB20_2: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -395,8 +392,8 @@ define i32 @length7(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB21_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB21_3: # %endblock ; X86-NEXT: popl %esi ; X86-NEXT: retl @@ -427,8 +424,8 @@ define i1 @length7_lt(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB22_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %eax ; X86-NEXT: .LBB22_3: # %endblock ; X86-NEXT: shrl $31, %eax ; X86-NEXT: # kill: def $al killed $al killed $eax @@ -479,8 +476,8 @@ define i32 @length8(ptr %X, ptr %Y) nounwind { ; X86-NEXT: .LBB24_2: # %res_block ; X86-NEXT: xorl %eax, %eax ; X86-NEXT: cmpl %edx, %ecx -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl $1, %eax +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %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 index bb089e5ddda87..9e713bfa6c392 100644 --- a/llvm/test/CodeGen/X86/memcmp.ll +++ b/llvm/test/CodeGen/X86/memcmp.ll @@ -165,11 +165,11 @@ define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind { define i32 @length3(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length3: ; X64: # %bb.0: -; X64-NEXT: movzwl (%rdi), %ecx -; X64-NEXT: movzwl (%rsi), %edx +; X64-NEXT: movzwl (%rdi), %eax +; X64-NEXT: movzwl (%rsi), %ecx +; X64-NEXT: rolw $8, %ax ; X64-NEXT: rolw $8, %cx -; X64-NEXT: rolw $8, %dx -; X64-NEXT: cmpw %dx, %cx +; X64-NEXT: cmpw %cx, %ax ; X64-NEXT: jne .LBB11_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 2(%rdi), %eax @@ -177,10 +177,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB11_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpw %dx, %cx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind ret i32 %m @@ -304,11 +303,11 @@ define i1 @length4_eq_const(ptr %X) nounwind { define i32 @length5(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length5: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB20_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -316,10 +315,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind { ; X64-NEXT: subl %ecx, %eax ; X64-NEXT: retq ; X64-NEXT: .LBB20_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind ret i32 %m @@ -344,11 +342,11 @@ define i1 @length5_eq(ptr %X, ptr %Y) nounwind { define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X64-LABEL: length5_lt: ; X64: # %bb.0: -; X64-NEXT: movl (%rdi), %ecx -; X64-NEXT: movl (%rsi), %edx +; X64-NEXT: movl (%rdi), %eax +; X64-NEXT: movl (%rsi), %ecx +; X64-NEXT: bswapl %eax ; X64-NEXT: bswapl %ecx -; X64-NEXT: bswapl %edx -; X64-NEXT: cmpl %edx, %ecx +; X64-NEXT: cmpl %ecx, %eax ; X64-NEXT: jne .LBB22_3 ; X64-NEXT: # %bb.1: # %loadbb1 ; X64-NEXT: movzbl 4(%rdi), %eax @@ -358,10 +356,9 @@ define i1 @length5_lt(ptr %X, ptr %Y) nounwind { ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq ; X64-NEXT: .LBB22_3: # %res_block -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: movzbl %al, %eax +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -390,8 +387,8 @@ define i32 @length7(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB23_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB23_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind @@ -418,8 +415,8 @@ define i1 @length7_lt(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB24_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpl %edx, %ecx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB24_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -566,8 +563,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB33_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB33_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind @@ -624,8 +621,8 @@ define i32 @length15(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB36_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB36_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind @@ -652,8 +649,8 @@ define i1 @length15_lt(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB37_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB37_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -681,8 +678,8 @@ define i32 @length15_const(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB38_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rcx, %rdx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB38_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 @@ -722,8 +719,8 @@ define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB40_2: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rax, %rcx -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %edx ; X64-NEXT: .LBB40_3: # %endblock ; X64-NEXT: testl %edx, %edx ; X64-NEXT: setg %al @@ -755,8 +752,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind { ; X64-NEXT: .LBB41_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB41_3: # %endblock ; X64-NEXT: retq %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind @@ -825,8 +822,8 @@ define i1 @length16_lt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB43_2: # %res_block ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpq %rdx, %rcx -; X64-NEXT: sbbl %eax, %eax -; X64-NEXT: orl $1, %eax +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %eax ; X64-NEXT: .LBB43_3: # %endblock ; X64-NEXT: shrl $31, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax @@ -856,8 +853,8 @@ define i1 @length16_gt(ptr %x, ptr %y) nounwind { ; X64-NEXT: .LBB44_2: # %res_block ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: cmpq %rcx, %rax -; X64-NEXT: sbbl %edx, %edx -; X64-NEXT: orl $1, %edx +; X64-NEXT: setae %dl +; X64-NEXT: leal -1(%rdx,%rdx), %edx ; X64-NEXT: .LBB44_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 index e6e77f4e4eba7..1921cf383b2f2 100644 --- a/llvm/test/CodeGen/X86/midpoint-int.ll +++ b/llvm/test/CodeGen/X86/midpoint-int.ll @@ -80,11 +80,11 @@ define i32 @scalar_i32_unsigned_reg_reg(i32 %a1, i32 %a2) nounwind { ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-NEXT: xorl %edx, %edx +; X86-NEXT: xorl %eax, %eax ; X86-NEXT: movl %edi, %esi ; X86-NEXT: subl %ecx, %esi -; X86-NEXT: sbbl %edx, %edx -; X86-NEXT: orl $1, %edx +; X86-NEXT: setae %al +; X86-NEXT: leal -1(%eax,%eax), %edx ; X86-NEXT: movl %ecx, %eax ; X86-NEXT: subl %edi, %eax ; X86-NEXT: ja .LBB1_2 @@ -699,10 +699,10 @@ define i16 @scalar_i16_signed_reg_reg(i16 %a1, i16 %a2) nounwind { 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 %ecx, %ecx +; X64-NEXT: xorl %eax, %eax ; X64-NEXT: cmpw %di, %si -; X64-NEXT: sbbl %ecx, %ecx -; X64-NEXT: orl $1, %ecx +; X64-NEXT: setae %al +; X64-NEXT: leal -1(%rax,%rax), %ecx ; X64-NEXT: movl %edi, %eax ; X64-NEXT: subl %esi, %eax ; X64-NEXT: movzwl %di, %edx @@ -718,7 +718,7 @@ define i16 @scalar_i16_unsigned_reg_reg(i16 %a1, i16 %a2) nounwind { ; ; X86-LABEL: scalar_i16_unsigned_reg_reg: ; X86: # %bb.0: -; X86-NEXT: pushl %esi +; X86-NEXT: pushl %ebx ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl %ecx, %eax @@ -727,16 +727,16 @@ define i16 @scalar_i16_unsigned_reg_reg(i16 %a1, i16 %a2) nounwind { ; X86-NEXT: # %bb.1: ; X86-NEXT: negl %eax ; X86-NEXT: .LBB11_2: -; X86-NEXT: xorl %esi, %esi +; X86-NEXT: xorl %ebx, %ebx ; X86-NEXT: cmpw %cx, %dx -; X86-NEXT: sbbl %esi, %esi -; X86-NEXT: orl $1, %esi +; X86-NEXT: setae %bl +; X86-NEXT: leal -1(%ebx,%ebx), %edx ; X86-NEXT: movzwl %ax, %eax ; X86-NEXT: shrl %eax -; X86-NEXT: imull %esi, %eax +; X86-NEXT: imull %edx, %eax ; X86-NEXT: addl %ecx, %eax ; X86-NEXT: # kill: def $ax killed $ax killed $eax -; X86-NEXT: popl %esi +; X86-NEXT: popl %ebx ; X86-NEXT: retl %t3 = icmp ugt i16 %a1, %a2 %t4 = select i1 %t3, i16 -1, i16 1 diff --git a/llvm/test/CodeGen/X86/select.ll b/llvm/test/CodeGen/X86/select.ll index d2e7a61bafb1c..4e31b48ec5cec 100644 --- a/llvm/test/CodeGen/X86/select.ll +++ b/llvm/test/CodeGen/X86/select.ll @@ -748,8 +748,8 @@ define i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone { ; CHECK: ## %bb.0: ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpq $1, %rdi -; CHECK-NEXT: sbbq %rax, %rax -; CHECK-NEXT: orq $1, %rax +; CHECK-NEXT: setae %al +; CHECK-NEXT: leaq -1(%rax,%rax), %rax ; CHECK-NEXT: retq ; ; ATHLON-LABEL: test10: @@ -987,25 +987,25 @@ define i32 @PR53006(i32 %x) { ; CHECK: ## %bb.0: ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: negl %edi -; CHECK-NEXT: sbbl %eax, %eax -; CHECK-NEXT: orl $1, %eax +; CHECK-NEXT: setae %al +; CHECK-NEXT: leal -1(%rax,%rax), %eax ; CHECK-NEXT: retq ; ; ATHLON-LABEL: PR53006: ; ATHLON: ## %bb.0: ; ATHLON-NEXT: xorl %eax, %eax +; ATHLON-NEXT: xorl %ecx, %ecx ; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax -; ATHLON-NEXT: sbbl %eax, %eax -; ATHLON-NEXT: orl $1, %eax +; ATHLON-NEXT: setae %cl +; ATHLON-NEXT: leal -1(%ecx,%ecx), %eax ; ATHLON-NEXT: retl ; ; MCU-LABEL: PR53006: ; MCU: # %bb.0: ; MCU-NEXT: xorl %ecx, %ecx ; MCU-NEXT: negl %eax -; MCU-NEXT: sbbl %ecx, %ecx -; MCU-NEXT: orl $1, %ecx -; MCU-NEXT: movl %ecx, %eax +; MCU-NEXT: setae %cl +; MCU-NEXT: leal -1(%ecx,%ecx), %eax ; MCU-NEXT: retl %z = icmp eq i32 %x, 0 %r = select i1 %z, i32 1, i32 -1