aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorjjasmine <jjasmine@igalia.com>2025-07-16 08:35:13 -0700
committerGitHub <noreply@github.com>2025-07-16 08:35:13 -0700
commit2206c7d4afc28d78c23db48de29d600ce1e8791b (patch)
treee2e99c6d590d848ef7e0edaa9f75793248dd371b /llvm
parent33396d71e9aef624670380e11348a11b8ff74246 (diff)
downloadllvm-2206c7d4afc28d78c23db48de29d600ce1e8791b.zip
llvm-2206c7d4afc28d78c23db48de29d600ce1e8791b.tar.gz
llvm-2206c7d4afc28d78c23db48de29d600ce1e8791b.tar.bz2
[InstSimplify] Fold trig functions call of poison to poison (#148969)
Fold trig functions call of poison to poison. This includes sin, cos, asin, acos, atan, atan2, sinh, cosh, sincos, sincospi. Test cases are fixed and also added to llvm/test/Transforms/InstSimplify/fold-intrinsics.ll just like in https://github.com/llvm/llvm-project/pull/146750
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp12
-rw-r--r--llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll3
-rw-r--r--llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll6
-rw-r--r--llvm/test/Transforms/InstSimplify/fold-intrinsics.ll199
-rw-r--r--llvm/test/Transforms/InstSimplify/sincos.ll9
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp4
6 files changed, 219 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 21f844c..61a322b 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -7914,6 +7914,18 @@ bool llvm::intrinsicPropagatesPoison(Intrinsic::ID IID) {
case Intrinsic::smul_fix_sat:
case Intrinsic::pow:
case Intrinsic::powi:
+ case Intrinsic::sin:
+ case Intrinsic::sinh:
+ case Intrinsic::cos:
+ case Intrinsic::cosh:
+ case Intrinsic::sincos:
+ case Intrinsic::sincospi:
+ case Intrinsic::tan:
+ case Intrinsic::tanh:
+ case Intrinsic::asin:
+ case Intrinsic::acos:
+ case Intrinsic::atan:
+ case Intrinsic::atan2:
case Intrinsic::canonicalize:
case Intrinsic::sqrt:
return true;
diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll b/llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll
index d824d6d..3cb6290b 100644
--- a/llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll
+++ b/llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll
@@ -35,8 +35,7 @@ define double @test_atan_neg0() {
define double @test_atan_poison() {
; CHECK-LABEL: define double @test_atan_poison() {
-; CHECK-NEXT: [[RES:%.*]] = call double @llvm.atan.f64(double poison)
-; CHECK-NEXT: ret double [[RES]]
+; CHECK-NEXT: ret double poison
;
%res = call double @llvm.atan.f64(double poison)
ret double %res
diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll b/llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll
index a4f318b..9641938 100644
--- a/llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll
@@ -35,8 +35,7 @@ define double @test_sinh_neg0() {
define double @test_sinh_poison() {
; CHECK-LABEL: define double @test_sinh_poison() {
-; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double poison)
-; CHECK-NEXT: ret double [[RES]]
+; CHECK-NEXT: ret double poison
;
%res = call double @llvm.sinh.f64(double poison)
ret double %res
@@ -121,8 +120,7 @@ define double @test_cosh_neg0() {
define double @test_cosh_poison() {
; CHECK-LABEL: define double @test_cosh_poison() {
-; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double poison)
-; CHECK-NEXT: ret double [[RES]]
+; CHECK-NEXT: ret double poison
;
%res = call double @llvm.cosh.f64(double poison)
ret double %res
diff --git a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
index 8578aa9..e4cfa46 100644
--- a/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/fold-intrinsics.ll
@@ -87,3 +87,202 @@ define void @pow_poison(i16 %arg_int,float %arg_flt, ptr %P) {
ret void
}
+
+define void @sin_poison(ptr %P) {
+; CHECK-LABEL: @sin_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %sin_f32 = call float @llvm.sin(float poison)
+ store volatile float %sin_f32, ptr %P
+
+ %sin_2xf32 = call <2 x float> @llvm.sin(<2 x float> poison)
+ store volatile <2 x float> %sin_2xf32, ptr %P
+
+ %sin_4xf64 = call <4 x double> @llvm.sin(<4 x double> poison)
+ store volatile <4 x double> %sin_4xf64, ptr %P
+
+ %asin_f32 = call float @llvm.asin(float poison)
+ store volatile float %asin_f32, ptr %P
+
+ %asin_2xf32 = call <2 x float> @llvm.asin(<2 x float> poison)
+ store volatile <2 x float> %asin_2xf32, ptr %P
+
+ %asin_4xf64 = call <4 x double> @llvm.asin(<4 x double> poison)
+ store volatile <4 x double> %asin_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @cos_poison(ptr %P) {
+; CHECK-LABEL: @cos_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %cos_f32 = call float @llvm.cos(float poison)
+ store volatile float %cos_f32, ptr %P
+
+ %cos_2xf32 = call <2 x float> @llvm.cos(<2 x float> poison)
+ store volatile <2 x float> %cos_2xf32, ptr %P
+
+ %cos_4xf64 = call <4 x double> @llvm.cos(<4 x double> poison)
+ store volatile <4 x double> %cos_4xf64, ptr %P
+
+ %acos_f32 = call float @llvm.acos(float poison)
+ store volatile float %acos_f32, ptr %P
+
+ %acos_2xf32 = call <2 x float> @llvm.acos(<2 x float> poison)
+ store volatile <2 x float> %acos_2xf32, ptr %P
+
+ %acos_4xf64 = call <4 x double> @llvm.acos(<4 x double> poison)
+ store volatile <4 x double> %acos_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @tan_poison(ptr %P) {
+; CHECK-LABEL: @tan_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %tan_f32 = call float @llvm.tan(float poison)
+ store volatile float %tan_f32, ptr %P
+
+ %tan_2xf32 = call <2 x float> @llvm.tan(<2 x float> poison)
+ store volatile <2 x float> %tan_2xf32, ptr %P
+
+ %tan_4xf64 = call <4 x double> @llvm.tan(<4 x double> poison)
+ store volatile <4 x double> %tan_4xf64, ptr %P
+
+ %atan_f32 = call float @llvm.atan(float poison)
+ store volatile float %atan_f32, ptr %P
+
+ %atan_2xf32 = call <2 x float> @llvm.atan(<2 x float> poison)
+ store volatile <2 x float> %atan_2xf32, ptr %P
+
+ %atan_4xf64 = call <4 x double> @llvm.atan(<4 x double> poison)
+ store volatile <4 x double> %atan_4xf64, ptr %P
+
+ %atan2_f32 = call float @llvm.atan2(float poison, float poison)
+ store volatile float %atan2_f32, ptr %P
+
+ %atan2_2xf32 = call <2 x float> @llvm.atan2(<2 x float> poison, <2 x float> poison)
+ store volatile <2 x float> %atan2_2xf32, ptr %P
+
+ %atan2_4xf64 = call <4 x double> @llvm.atan2(<4 x double> poison, <4 x double> poison)
+ store volatile <4 x double> %atan2_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @sincos_poison(ptr %P) {
+; CHECK-LABEL: @sincos_poison(
+; CHECK-NEXT: store volatile { float, float } poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile { <2 x float>, <2 x float> } poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile { <4 x double>, <4 x double> } poison, ptr [[P]], align 32
+; CHECK-NEXT: store volatile { float, float } poison, ptr [[P]], align 4
+; CHECK-NEXT: store volatile { <2 x float>, <2 x float> } poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile { <4 x double>, <4 x double> } poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %sincos_f32 = call { float, float } @llvm.sincos(float poison)
+ store volatile { float, float } %sincos_f32, ptr %P
+
+ %sincos_2xf32 = call { <2 x float>, <2 x float> } @llvm.sincos(<2 x float> poison)
+ store volatile { <2 x float>, <2 x float> } %sincos_2xf32, ptr %P
+
+ %sincos_4xf64 = call { <4 x double>, <4 x double> } @llvm.sincos(<4 x double> poison)
+ store volatile { <4 x double>, <4 x double> } %sincos_4xf64, ptr %P
+
+ %sincospi_f32 = call { float, float } @llvm.sincospi(float poison)
+ store volatile { float, float } %sincospi_f32, ptr %P
+
+ %sincospi_2xf32 = call { <2 x float>, <2 x float> } @llvm.sincospi(<2 x float> poison)
+ store volatile { <2 x float>, <2 x float> } %sincospi_2xf32, ptr %P
+
+ %sincospi_4xf64 = call { <4 x double>, <4 x double> } @llvm.sincospi(<4 x double> poison)
+ store volatile { <4 x double>, <4 x double> } %sincospi_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @sinh_poison(ptr %P) {
+; CHECK-LABEL: @sinh_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %sinh_f32 = call float @llvm.sinh(float poison)
+ store volatile float %sinh_f32, ptr %P
+
+ %sinh_2xf32 = call <2 x float> @llvm.sinh(<2 x float> poison)
+ store volatile <2 x float> %sinh_2xf32, ptr %P
+
+ %sinh_4xf64 = call <4 x double> @llvm.sinh(<4 x double> poison)
+ store volatile <4 x double> %sinh_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @cosh_poison(ptr %P) {
+; CHECK-LABEL: @cosh_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %cosh_f32 = call float @llvm.cosh(float poison)
+ store volatile float %cosh_f32, ptr %P
+
+ %cosh_2xf32 = call <2 x float> @llvm.cosh(<2 x float> poison)
+ store volatile <2 x float> %cosh_2xf32, ptr %P
+
+ %cosh_4xf64 = call <4 x double> @llvm.cosh(<4 x double> poison)
+ store volatile <4 x double> %cosh_4xf64, ptr %P
+
+ ret void
+}
+
+
+define void @tanh_poison(ptr %P) {
+; CHECK-LABEL: @tanh_poison(
+; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4
+; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8
+; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32
+; CHECK-NEXT: ret void
+;
+ %tanh_f32 = call float @llvm.tanh(float poison)
+ store volatile float %tanh_f32, ptr %P
+
+ %tanh_2xf32 = call <2 x float> @llvm.tanh(<2 x float> poison)
+ store volatile <2 x float> %tanh_2xf32, ptr %P
+
+ %tanh_4xf64 = call <4 x double> @llvm.tanh(<4 x double> poison)
+ store volatile <4 x double> %tanh_4xf64, ptr %P
+
+ ret void
+}
diff --git a/llvm/test/Transforms/InstSimplify/sincos.ll b/llvm/test/Transforms/InstSimplify/sincos.ll
index e0f81ee..144da53 100644
--- a/llvm/test/Transforms/InstSimplify/sincos.ll
+++ b/llvm/test/Transforms/InstSimplify/sincos.ll
@@ -50,8 +50,7 @@ define { <2 x float>, <2 x float> } @sincos_zero_vector() {
define { float, float } @sincos_poison() {
; CHECK-LABEL: define { float, float } @sincos_poison() {
-; CHECK-NEXT: [[RET:%.*]] = call { float, float } @llvm.sincos.f32(float poison)
-; CHECK-NEXT: ret { float, float } [[RET]]
+; CHECK-NEXT: ret { float, float } poison
;
%ret = call { float, float } @llvm.sincos.f32(float poison)
ret { float, float } %ret
@@ -59,8 +58,7 @@ define { float, float } @sincos_poison() {
define { <2 x float>, <2 x float> } @sincos_poison_vector() {
; CHECK-LABEL: define { <2 x float>, <2 x float> } @sincos_poison_vector() {
-; CHECK-NEXT: [[RET:%.*]] = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> poison)
-; CHECK-NEXT: ret { <2 x float>, <2 x float> } [[RET]]
+; CHECK-NEXT: ret { <2 x float>, <2 x float> } poison
;
%ret = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> poison)
ret { <2 x float>, <2 x float> } %ret
@@ -68,8 +66,7 @@ define { <2 x float>, <2 x float> } @sincos_poison_vector() {
define { <vscale x 2 x float>, <vscale x 2 x float> } @sincos_poison_scalable_vector() {
; CHECK-LABEL: define { <vscale x 2 x float>, <vscale x 2 x float> } @sincos_poison_scalable_vector() {
-; CHECK-NEXT: [[RET:%.*]] = call { <vscale x 2 x float>, <vscale x 2 x float> } @llvm.sincos.nxv2f32(<vscale x 2 x float> poison)
-; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x float> } [[RET]]
+; CHECK-NEXT: ret { <vscale x 2 x float>, <vscale x 2 x float> } poison
;
%ret = call { <vscale x 2 x float>, <vscale x 2 x float> } @llvm.sincos.nxv2f32(<vscale x 2 x float> poison)
ret { <vscale x 2 x float>, <vscale x 2 x float> } %ret
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 7a48105..4b47655 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -912,8 +912,8 @@ TEST(ValueTracking, propagatesPoison) {
{false, "call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %shamt)", 2},
{true, "call float @llvm.sqrt.f32(float %fx)", 0},
{true, "call float @llvm.powi.f32.i32(float %fx, i32 %x)", 0},
- {false, "call float @llvm.sin.f32(float %fx)", 0},
- {false, "call float @llvm.cos.f32(float %fx)", 0},
+ {true, "call float @llvm.sin.f32(float %fx)", 0},
+ {true, "call float @llvm.cos.f32(float %fx)", 0},
{true, "call float @llvm.pow.f32(float %fx, float %fy)", 0},
{false, "call float @llvm.exp.f32(float %fx)", 0},
{false, "call float @llvm.exp2.f32(float %fx)", 0},