[X86] Match SETCC_CARRY in addition of SUB when trying to reconstruct LEA (#126551)

As per title.

This is not a huge deal at the moment, but becomes one when matching
node in topological order in the DAGCombiner, and is generally more
stable than the existing.
This commit is contained in:
deadalnix 2025-02-14 10:38:25 +01:00 committed by GitHub
parent 7eadc1960d
commit 2ad1089d63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 228 additions and 238 deletions

View File

@ -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<ConstantSDNode>(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<ConstantSDNode>(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));

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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