[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