diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-01 20:04:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-01 20:04:40 +0000 |
commit | 6304b0dd631ba65f3e325d8ed85a0f770d74d633 (patch) | |
tree | 4f3d8083fe8b5d1c868d04141701cdade64fb7c8 | |
parent | 904c2fadbf44c47b418860f928f435a58da08bb6 (diff) |
fix PR6195, a bug constant folding scalar -> vector compares.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94997 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 8 | ||||
-rw-r--r-- | test/Transforms/InstCombine/icmp.ll | 9 |
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 5e4b472097..d537b27376 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -2017,10 +2017,12 @@ Constant *llvm::ConstantFoldCompareInstruction(LLVMContext &Context, return ConstantInt::get(Type::getInt1Ty(Context), Result); // If the right hand side is a bitcast, try using its inverse to simplify - // it by moving it to the left hand side. + // it by moving it to the left hand side. We can't do this if it would turn + // a vector compare into scalar compare of visa versa. if (ConstantExpr *CE2 = dyn_cast<ConstantExpr>(C2)) { - if (CE2->getOpcode() == Instruction::BitCast) { - Constant *CE2Op0 = CE2->getOperand(0); + Constant *CE2Op0 = CE2->getOperand(0); + if (CE2->getOpcode() == Instruction::BitCast && + isa<VectorType>(CE2->getType()) ==isa<VectorType>(CE2Op0->getType())){ Constant *Inverse = ConstantExpr::getBitCast(C1, CE2Op0->getType()); return ConstantExpr::getICmp(pred, Inverse, CE2Op0); } diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 79fa220752..c2234a10e5 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -112,3 +112,12 @@ define i1 @test11(i32 %x) { ; CHECK: ret i1 true } +; PR6195 +define i1 @test12(i1 %A) { + %S = select i1 %A, i64 -4294967295, i64 8589934591 + %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S + ret i1 %B +; CHECK: @test12 +; CHECK-NEXT: %B = select i1 +; CHECK-NEXT: ret i1 %B +} |