1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Teach codegen to handle:

(X != null) | (Y != null) --> (X|Y) != 0
 (X == null) & (Y == null) --> (X|Y) == 0

so that instcombine can stop doing this for pointers.  This is part of PR3351,
which is a case where instcombine doing this for pointers (inserting ptrtoint)
is pessimizing code.

llvm-svn: 92406
This commit is contained in:
Chris Lattner 2010-01-02 00:00:03 +00:00
parent 4e49a69ec5
commit fe8af82cd4
2 changed files with 54 additions and 2 deletions

View File

@ -1195,6 +1195,18 @@ SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases){
return false;
}
// Handle: (X != null) | (Y != null) --> (X|Y) != 0
// Handle: (X == null) & (Y == null) --> (X|Y) == 0
if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
Cases[0].CC == Cases[1].CC &&
isa<Constant>(Cases[0].CmpRHS) &&
cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
if (Cases[0].CC == ISD::SETEQ && Cases[0].TrueBB == Cases[1].ThisBB)
return false;
if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
return false;
}
return true;
}

View File

@ -1,9 +1,9 @@
; RUN: llc < %s -march=x86 | FileCheck %s
; rdar://7475489
define i32 @t(i32 %a, i32 %b) nounwind ssp {
define i32 @test1(i32 %a, i32 %b) nounwind ssp {
entry:
; CHECK: t:
; CHECK: test1:
; CHECK: xorb
; CHECK-NOT: andb
; CHECK-NOT: shrb
@ -27,3 +27,43 @@ bb1: ; preds = %entry
declare i32 @foo(...)
declare i32 @bar(...)
; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0
define i32 @test2(i32* %P, i32* %Q) nounwind ssp {
entry:
%a = icmp eq i32* %P, null ; <i1> [#uses=1]
%b = icmp eq i32* %Q, null ; <i1> [#uses=1]
%c = and i1 %a, %b
br i1 %c, label %bb1, label %return
bb1: ; preds = %entry
ret i32 4
return: ; preds = %entry
ret i32 192
; CHECK: test2:
; CHECK: movl 4(%esp), %eax
; CHECK-NEXT: orl 8(%esp), %eax
; CHECK-NEXT: jne LBB2_2
}
; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0
define i32 @test3(i32* %P, i32* %Q) nounwind ssp {
entry:
%a = icmp ne i32* %P, null ; <i1> [#uses=1]
%b = icmp ne i32* %Q, null ; <i1> [#uses=1]
%c = or i1 %a, %b
br i1 %c, label %bb1, label %return
bb1: ; preds = %entry
ret i32 4
return: ; preds = %entry
ret i32 192
; CHECK: test3:
; CHECK: movl 4(%esp), %eax
; CHECK-NEXT: orl 8(%esp), %eax
; CHECK-NEXT: je LBB3_2
}