Have InlineCost check constant fcmps

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186758 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matt Arsenault 2013-07-20 04:09:00 +00:00
parent 6cc16a0479
commit ff29d235ed
2 changed files with 39 additions and 4 deletions

View File

@ -124,7 +124,7 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
bool visitIntToPtr(IntToPtrInst &I); bool visitIntToPtr(IntToPtrInst &I);
bool visitCastInst(CastInst &I); bool visitCastInst(CastInst &I);
bool visitUnaryInstruction(UnaryInstruction &I); bool visitUnaryInstruction(UnaryInstruction &I);
bool visitICmp(ICmpInst &I); bool visitCmpInst(CmpInst &I);
bool visitSub(BinaryOperator &I); bool visitSub(BinaryOperator &I);
bool visitBinaryOperator(BinaryOperator &I); bool visitBinaryOperator(BinaryOperator &I);
bool visitLoad(LoadInst &I); bool visitLoad(LoadInst &I);
@ -490,7 +490,7 @@ bool CallAnalyzer::visitUnaryInstruction(UnaryInstruction &I) {
return false; return false;
} }
bool CallAnalyzer::visitICmp(ICmpInst &I) { bool CallAnalyzer::visitCmpInst(CmpInst &I) {
Value *LHS = I.getOperand(0), *RHS = I.getOperand(1); Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
// First try to handle simplified comparisons. // First try to handle simplified comparisons.
if (!isa<Constant>(LHS)) if (!isa<Constant>(LHS))
@ -499,12 +499,16 @@ bool CallAnalyzer::visitICmp(ICmpInst &I) {
if (!isa<Constant>(RHS)) if (!isa<Constant>(RHS))
if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS)) if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
RHS = SimpleRHS; RHS = SimpleRHS;
if (Constant *CLHS = dyn_cast<Constant>(LHS)) if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
if (Constant *CRHS = dyn_cast<Constant>(RHS)) if (Constant *CRHS = dyn_cast<Constant>(RHS))
if (Constant *C = ConstantExpr::getICmp(I.getPredicate(), CLHS, CRHS)) { if (Constant *C = ConstantExpr::getCompare(I.getPredicate(), CLHS, CRHS)) {
SimplifiedValues[&I] = C; SimplifiedValues[&I] = C;
return true; return true;
} }
}
if (I.getOpcode() == Instruction::FCmp)
return false;
// Otherwise look for a comparison between constant offset pointers with // Otherwise look for a comparison between constant offset pointers with
// a common base. // a common base.

View File

@ -187,6 +187,37 @@ bb.false:
ret i64 %y8 ret i64 %y8
} }
define float @caller6() {
; Check that we can constant-prop through fcmp instructions
;
; CHECK-LABEL: @caller6(
; CHECK-NOT: call
; CHECK: ret
%x = call float @callee6(float 42.0)
ret float %x
}
define float @callee6(float %x) {
%icmp = fcmp ugt float %x, 42.0
br i1 %icmp, label %bb.true, label %bb.false
bb.true:
; This block musn't be counted in the inline cost.
%x1 = fadd float %x, 1.0
%x2 = fadd float %x1, 1.0
%x3 = fadd float %x2, 1.0
%x4 = fadd float %x3, 1.0
%x5 = fadd float %x4, 1.0
%x6 = fadd float %x5, 1.0
%x7 = fadd float %x6, 1.0
%x8 = fadd float %x7, 1.0
ret float %x8
bb.false:
ret float %x
}
define i32 @PR13412.main() { define i32 @PR13412.main() {
; This is a somewhat complicated three layer subprogram that was reported to ; This is a somewhat complicated three layer subprogram that was reported to