[PATCH] Make InlineCost check for constant foldable floating point compares
Nick Lewycky
nicholas at mxc.ca
Fri Jul 19 20:31:17 PDT 2013
Matt Arsenault wrote:
> Hi chandlerc,
>
> Currently it only checks icmp
>
> http://llvm-reviews.chandlerc.com/D1182
This looks good to me. Thanks for this fix!
Nick
>
> Files:
> lib/Analysis/IPA/InlineCost.cpp
> test/Transforms/Inline/inline_constprop.ll
>
> Index: lib/Analysis/IPA/InlineCost.cpp
> ===================================================================
> --- lib/Analysis/IPA/InlineCost.cpp
> +++ lib/Analysis/IPA/InlineCost.cpp
> @@ -124,7 +124,7 @@
> bool visitIntToPtr(IntToPtrInst&I);
> bool visitCastInst(CastInst&I);
> bool visitUnaryInstruction(UnaryInstruction&I);
> - bool visitICmp(ICmpInst&I);
> + bool visitCmpInst(CmpInst&I);
> bool visitSub(BinaryOperator&I);
> bool visitBinaryOperator(BinaryOperator&I);
> bool visitLoad(LoadInst&I);
> @@ -490,21 +490,25 @@
> return false;
> }
>
> -bool CallAnalyzer::visitICmp(ICmpInst&I) {
> +bool CallAnalyzer::visitCmpInst(CmpInst&I) {
> Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
> // First try to handle simplified comparisons.
> if (!isa<Constant>(LHS))
> if (Constant *SimpleLHS = SimplifiedValues.lookup(LHS))
> LHS = SimpleLHS;
> if (!isa<Constant>(RHS))
> if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
> 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 *C = ConstantExpr::getICmp(I.getPredicate(), CLHS, CRHS)) {
> + if (Constant *C = ConstantExpr::getCompare(I.getPredicate(), CLHS, CRHS)) {
> SimplifiedValues[&I] = C;
> return true;
> }
> + }
> +
> + if (I.getOpcode() == Instruction::FCmp)
> + return false;
>
> // Otherwise look for a comparison between constant offset pointers with
> // a common base.
> Index: test/Transforms/Inline/inline_constprop.ll
> ===================================================================
> --- test/Transforms/Inline/inline_constprop.ll
> +++ test/Transforms/Inline/inline_constprop.ll
> @@ -187,6 +187,37 @@
> 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() {
> ; This is a somewhat complicated three layer subprogram that was reported to
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list