[llvm] a4a426c - [InstCombine] Added llvm.powi optimizations

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 16 11:03:13 PDT 2021


This seems worthy of review given it involves floating point semantics.  
Can you revert and send through pre-review please?

Philip

On 9/16/21 10:42 AM, Dávid Bolvanský via llvm-commits wrote:
> Author: Dávid Bolvanský
> Date: 2021-09-16T19:42:21+02:00
> New Revision: a4a426c9e0da06b9ff4c58d3a15a1e789efebfb6
>
> URL: https://github.com/llvm/llvm-project/commit/a4a426c9e0da06b9ff4c58d3a15a1e789efebfb6
> DIFF: https://github.com/llvm/llvm-project/commit/a4a426c9e0da06b9ff4c58d3a15a1e789efebfb6.diff
>
> LOG: [InstCombine] Added llvm.powi optimizations
>
> If power is even:
> powi(-x, p) -> powi(x, p)
> powi(fabs(x), p) -> powi(x, p)
> powi(copysign(x, y), p) -> powi(x, p)
>
> Added:
>      
>
> Modified:
>      llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
>      llvm/test/Transforms/InstCombine/powi.ll
>
> Removed:
>      
>
>
> ################################################################################
> diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
> index d1ca0dbab37bb..0a2ec0993e00b 100644
> --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
> +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
> @@ -1182,6 +1182,19 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
>         if (Power->equalsInt(2))
>           return BinaryOperator::CreateFMulFMF(II->getArgOperand(0),
>                                                II->getArgOperand(0), II);
> +
> +      if (!Power->getValue()[0]) {
> +        Value *X;
> +        // If power is even:
> +        // powi(-x, p) -> powi(x, p)
> +        // powi(fabs(x), p) -> powi(x, p)
> +        // powi(copysign(x, y), p) -> powi(x, p)
> +        if (match(II->getArgOperand(0), m_FNeg(m_Value(X))) ||
> +            match(II->getArgOperand(0), m_FAbs(m_Value(X))) ||
> +            match(II->getArgOperand(0),
> +                  m_Intrinsic<Intrinsic::copysign>(m_Value(X), m_Value())))
> +          return replaceOperand(*II, 0, X);
> +      }
>       }
>       break;
>   
>
> diff  --git a/llvm/test/Transforms/InstCombine/powi.ll b/llvm/test/Transforms/InstCombine/powi.ll
> index 5fdb80211cbcb..a8b492d28b9e2 100644
> --- a/llvm/test/Transforms/InstCombine/powi.ll
> +++ b/llvm/test/Transforms/InstCombine/powi.ll
> @@ -8,8 +8,7 @@ declare double @llvm.copysign.f64(double, double)
>   define double @powi_fneg_even_int(double %x) {
>   ; CHECK-LABEL: @powi_fneg_even_int(
>   ; CHECK-NEXT:  entry:
> -; CHECK-NEXT:    [[FNEG:%.*]] = fneg double [[X:%.*]]
> -; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[FNEG]], i32 4)
> +; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
>   ; CHECK-NEXT:    ret double [[R]]
>   ;
>   entry:
> @@ -21,8 +20,7 @@ entry:
>   define double @powi_fabs_even_int(double %x) {
>   ; CHECK-LABEL: @powi_fabs_even_int(
>   ; CHECK-NEXT:  entry:
> -; CHECK-NEXT:    [[F:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])
> -; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[F]], i32 4)
> +; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
>   ; CHECK-NEXT:    ret double [[R]]
>   ;
>   entry:
> @@ -34,8 +32,7 @@ entry:
>   define double @powi_copysign_even_int(double %x, double %y) {
>   ; CHECK-LABEL: @powi_copysign_even_int(
>   ; CHECK-NEXT:  entry:
> -; CHECK-NEXT:    [[CS:%.*]] = tail call double @llvm.copysign.f64(double [[X:%.*]], double [[Y:%.*]])
> -; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[CS]], i32 4)
> +; CHECK-NEXT:    [[R:%.*]] = tail call double @llvm.powi.f64.i32(double [[X:%.*]], i32 4)
>   ; CHECK-NEXT:    ret double [[R]]
>   ;
>   entry:
>
>
>          
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list