[llvm] [SimplifyLibCalls] Add f128 type for merging sqrt into the power of exp (PR #112373)

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 15 08:04:23 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: None (lizhijin1024)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/112373.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp (+3) 
- (modified) llvm/test/Transforms/InstCombine/sqrt.ll (+22) 


``````````diff
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index db2acb9eed0938..aa7864ad4f6c0e 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2720,6 +2720,9 @@ Value *LibCallSimplifier::mergeSqrtToExp(CallInst *CI, IRBuilderBase &B) {
       ExpLb = LibFunc_exp;
       Exp2Lb = LibFunc_exp2;
       Exp10Lb = LibFunc_exp10;
+    } else if (CI->getType()->getScalarType()->isFP128Ty()) {
+      ExpLb = LibFunc_expl;
+      Exp2Lb = LibFunc_exp2l;
     } else
       return nullptr;
   } else
diff --git a/llvm/test/Transforms/InstCombine/sqrt.ll b/llvm/test/Transforms/InstCombine/sqrt.ll
index f72fe5a6a5817b..6168a61cf86cb0 100644
--- a/llvm/test/Transforms/InstCombine/sqrt.ll
+++ b/llvm/test/Transforms/InstCombine/sqrt.ll
@@ -201,6 +201,25 @@ define <2 x float> @sqrt_exp_vec(<2 x float> %x) {
   ret <2 x float> %res
 }
 
+define dso_local fp128 @sqrt_exp_long_double(fp128 %x, fp128 %y) {
+; CHECK-LABEL: @sqrt_exp_long_double(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MERGED_SQRT:%.*]] = fmul fast fp128 [[X:%.*]], 0xL00000000000000003FFE000000000000
+; CHECK-NEXT:    [[TMP0:%.*]] = call fast fp128 @llvm.exp.f128(fp128 [[MERGED_SQRT]])
+; CHECK-NEXT:    [[MERGED_SQRT1:%.*]] = fmul fast fp128 [[Y:%.*]], 0xL00000000000000003FFE000000000000
+; CHECK-NEXT:    [[TMP1:%.*]] = call fast fp128 @llvm.exp2.f128(fp128 [[MERGED_SQRT1]])
+; CHECK-NEXT:    [[ADD:%.*]] = fadd fast fp128 [[TMP0]], [[TMP1]]
+; CHECK-NEXT:    ret fp128 [[ADD]]
+;
+entry:
+  %0 = call fast fp128 @llvm.exp.f128(fp128 %x)
+  %1 = call fast fp128 @llvm.sqrt.f128(fp128 %0)
+  %2 = call fast fp128 @llvm.exp2.f128(fp128 %y)
+  %3 = call fast fp128 @llvm.sqrt.f128(fp128 %2)
+  %add = fadd fast fp128 %1, %3
+  ret fp128 %add
+}
+
 declare i32 @foo(double)
 declare double @sqrt(double) readnone
 declare float @sqrtf(float)
@@ -212,3 +231,6 @@ declare double @exp2(double)
 declare double @exp10(double)
 declare <2 x float> @llvm.exp.v2f32(<2 x float>)
 declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
+declare fp128 @llvm.exp.f128(fp128)
+declare fp128 @llvm.sqrt.f128(fp128)
+declare fp128 @llvm.exp2.f128(fp128)

``````````

</details>


https://github.com/llvm/llvm-project/pull/112373


More information about the llvm-commits mailing list