aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-02 00:31:05 +0000
committerChris Lattner <sabre@nondot.org>2010-01-02 00:31:05 +0000
commit0b178e25c4104f3577fed6e66bd2c17f9fc08eb2 (patch)
treed46127bd7e76c791264314f8fea8cca5d2dcabc2
parent09987f73f63a105abaa17024aa03fd677b7247a3 (diff)
remove the instcombine transformations that are inserting nasty
pointer to int casts that confuse later optimizations. See PR3351 for details. This improves but doesn't complete fix 483.xalancbmk because llvm-gcc does this xform in GCC's "fold" routine as well. Clang++ will do better I guess. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92408 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp30
-rw-r--r--test/Transforms/InstCombine/or.ll15
2 files changed, 0 insertions, 45 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 5f210da423..2a0df31a5f 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -4166,21 +4166,6 @@ Value *InstCombiner::FoldLogicalPlusAnd(Value *LHS, Value *RHS,
/// FoldAndOfICmps - Fold (icmp)&(icmp) if possible.
Instruction *InstCombiner::FoldAndOfICmps(Instruction &I,
ICmpInst *LHS, ICmpInst *RHS) {
- // (icmp eq A, null) & (icmp eq B, null) -->
- // (icmp eq (ptrtoint(A)|ptrtoint(B)), 0)
- if (TD &&
- LHS->getPredicate() == ICmpInst::ICMP_EQ &&
- RHS->getPredicate() == ICmpInst::ICMP_EQ &&
- isa<ConstantPointerNull>(LHS->getOperand(1)) &&
- isa<ConstantPointerNull>(RHS->getOperand(1))) {
- const Type *IntPtrTy = TD->getIntPtrType(I.getContext());
- Value *A = Builder->CreatePtrToInt(LHS->getOperand(0), IntPtrTy);
- Value *B = Builder->CreatePtrToInt(RHS->getOperand(0), IntPtrTy);
- Value *NewOr = Builder->CreateOr(A, B);
- return new ICmpInst(ICmpInst::ICMP_EQ, NewOr,
- Constant::getNullValue(IntPtrTy));
- }
-
Value *Val, *Val2;
ConstantInt *LHSCst, *RHSCst;
ICmpInst::Predicate LHSCC, RHSCC;
@@ -4861,21 +4846,6 @@ static Instruction *MatchSelectFromAndOr(Value *A, Value *B,
/// FoldOrOfICmps - Fold (icmp)|(icmp) if possible.
Instruction *InstCombiner::FoldOrOfICmps(Instruction &I,
ICmpInst *LHS, ICmpInst *RHS) {
- // (icmp ne A, null) | (icmp ne B, null) -->
- // (icmp ne (ptrtoint(A)|ptrtoint(B)), 0)
- if (TD &&
- LHS->getPredicate() == ICmpInst::ICMP_NE &&
- RHS->getPredicate() == ICmpInst::ICMP_NE &&
- isa<ConstantPointerNull>(LHS->getOperand(1)) &&
- isa<ConstantPointerNull>(RHS->getOperand(1))) {
- const Type *IntPtrTy = TD->getIntPtrType(I.getContext());
- Value *A = Builder->CreatePtrToInt(LHS->getOperand(0), IntPtrTy);
- Value *B = Builder->CreatePtrToInt(RHS->getOperand(0), IntPtrTy);
- Value *NewOr = Builder->CreateOr(A, B);
- return new ICmpInst(ICmpInst::ICMP_NE, NewOr,
- Constant::getNullValue(IntPtrTy));
- }
-
Value *Val, *Val2;
ConstantInt *LHSCst, *RHSCst;
ICmpInst::Predicate LHSCC, RHSCC;
diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll
index 4a140815f6..50552158c9 100644
--- a/test/Transforms/InstCombine/or.ll
+++ b/test/Transforms/InstCombine/or.ll
@@ -269,21 +269,6 @@ define i1 @test26(i32 %A, i32 %B) {
}
; PR5634
-define i1 @test27(i32* %A, i32* %B) {
- %C1 = icmp eq i32* %A, null
- %C2 = icmp eq i32* %B, null
- ; (A == 0) & (A == 0) --> (A|B) == 0
- %D = and i1 %C1, %C2
- ret i1 %D
-; CHECK: @test27
-; CHECK: ptrtoint i32* %A
-; CHECK: ptrtoint i32* %B
-; CHECK: or i32
-; CHECK: icmp eq i32 {{.*}}, 0
-; CHECK: ret i1
-}
-
-; PR5634
define i1 @test28(i32 %A, i32 %B) {
%C1 = icmp ne i32 %A, 0
%C2 = icmp ne i32 %B, 0