forked from OSchip/llvm-project
DAGCombine add (sext i1), X into sub X, (zext i1) if sext from i1 is illegal. The latter usually compiles into smaller code.
example code: unsigned foo(unsigned x, unsigned y) { if (x != 0) y--; return y; } before: _foo: ## @foo cmpl $1, 4(%esp) ## encoding: [0x83,0x7c,0x24,0x04,0x01] sbbl %eax, %eax ## encoding: [0x19,0xc0] notl %eax ## encoding: [0xf7,0xd0] addl 8(%esp), %eax ## encoding: [0x03,0x44,0x24,0x08] ret ## encoding: [0xc3] after: _foo: ## @foo cmpl $1, 4(%esp) ## encoding: [0x83,0x7c,0x24,0x04,0x01] movl 8(%esp), %eax ## encoding: [0x8b,0x44,0x24,0x08] adcl $-1, %eax ## encoding: [0x83,0xd0,0xff] ret ## encoding: [0xc3] llvm-svn: 122455
This commit is contained in:
parent
7a49ead680
commit
1f4dfbbcb0
|
@ -1443,6 +1443,15 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||
}
|
||||
}
|
||||
|
||||
// add (sext i1), X -> sub X, (zext i1)
|
||||
if (N0.getOpcode() == ISD::SIGN_EXTEND &&
|
||||
N0.getOperand(0).getValueType() == MVT::i1 &&
|
||||
!TLI.isOperationLegal(ISD::SIGN_EXTEND, MVT::i1)) {
|
||||
DebugLoc DL = N->getDebugLoc();
|
||||
SDValue ZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0.getOperand(0));
|
||||
return DAG.getNode(ISD::SUB, DL, VT, N1, ZExt);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
|
|
@ -120,3 +120,15 @@ entry:
|
|||
; X64: addq
|
||||
; X64-NEXT: sbbq
|
||||
; X64-NEXT: testb
|
||||
|
||||
define i32 @test9(i32 %x, i32 %y) nounwind readnone {
|
||||
%cmp = icmp eq i32 %x, 10
|
||||
%sub = sext i1 %cmp to i32
|
||||
%cond = add i32 %sub, %y
|
||||
ret i32 %cond
|
||||
; X64: test9:
|
||||
; X64: cmpl $10
|
||||
; X64: sete
|
||||
; X64: subl
|
||||
; X64: ret
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue