ConstantFoldInstOperands doesn't like compares, hand it off to instsimplify instead.

Fixes PR10040.

llvm-svn: 132254
This commit is contained in:
Benjamin Kramer 2011-05-28 10:16:58 +00:00
parent 046c47e970
commit fd53a27f99
2 changed files with 20 additions and 0 deletions

View File

@ -298,6 +298,16 @@ static Value *SimplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp,
return SimplifyBinOp(B->getOpcode(), B->getOperand(0), RepOp, TD);
}
// Same for CmpInsts.
if (CmpInst *C = dyn_cast<CmpInst>(I)) {
if (C->getOperand(0) == Op)
return SimplifyCmpInst(C->getPredicate(), RepOp, C->getOperand(1), TD);
if (C->getOperand(1) == Op)
return SimplifyCmpInst(C->getPredicate(), C->getOperand(0), RepOp, TD);
}
// TODO: We could hand off more cases to instsimplify here.
// If all operands are constant after substituting Op for RepOp then we can
// constant fold the instruction.
if (Constant *CRepOp = dyn_cast<Constant>(RepOp)) {

View File

@ -789,3 +789,13 @@ define i32 @test59(i32 %x, i32 %y) nounwind {
; CHECK-NEXT: and i32 %x, %y
; CHECK-NEXT: ret
}
define i1 @test60(i32 %x, i1* %y) nounwind {
%cmp = icmp eq i32 %x, 0
%load = load i1* %y, align 1
%cmp1 = icmp slt i32 %x, 1
%sel = select i1 %cmp, i1 %load, i1 %cmp1
ret i1 %sel
; CHECK: @test60
; CHECK: select
}