diff options
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/icmp.ll | 16 |
2 files changed, 20 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 3bc7fae77cb..4fe653b4bd0 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -4082,13 +4082,13 @@ Instruction *InstCombiner::foldICmpUsingKnownBits(ICmpInst &I) { computeUnsignedMinMaxValuesFromKnownBits(Op1Known, Op1Min, Op1Max); } - // If Min and Max are known to be the same, then SimplifyDemandedBits - // figured out that the LHS is a constant. Constant fold this now, so that + // If Min and Max are known to be the same, then SimplifyDemandedBits figured + // out that the LHS or RHS is a constant. Constant fold this now, so that // code below can assume that Min != Max. if (!isa<Constant>(Op0) && Op0Min == Op0Max) - return new ICmpInst(Pred, ConstantInt::get(Op0->getType(), Op0Min), Op1); + return new ICmpInst(Pred, ConstantExpr::getIntegerValue(Ty, Op0Min), Op1); if (!isa<Constant>(Op1) && Op1Min == Op1Max) - return new ICmpInst(Pred, Op0, ConstantInt::get(Op1->getType(), Op1Min)); + return new ICmpInst(Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Min)); // Based on the range information we know about the LHS, see if we can // simplify this comparison. For example, (x&4) < 8 is always true. diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index 4ed666aaa19..26d21fb15a0 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -3286,3 +3286,19 @@ define i32 @abs_preserve(i32 %x) { %abs = select i1 %c, i32 %a, i32 %nega ret i32 %abs } + +; Don't crash by assuming the compared values are integers. + +declare void @llvm.assume(i1) +define i1 @PR35794(i32* %a) { +; CHECK-LABEL: @PR35794( +; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i32* %a, null +; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]]) +; CHECK-NEXT: ret i1 true +; + %cmp = icmp sgt i32* %a, inttoptr (i64 -1 to i32*) + %maskcond = icmp eq i32* %a, null + tail call void @llvm.assume(i1 %maskcond) + ret i1 %cmp +} + |