[llvm] de8e0a4 - ValueTracking: Teach canCreateUndefOrPoison about saturating intrinsics
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 23 06:42:39 PST 2022
Author: Matt Arsenault
Date: 2022-12-23T09:42:33-05:00
New Revision: de8e0a439777014d7d85007c379579e58bba2efe
URL: https://github.com/llvm/llvm-project/commit/de8e0a439777014d7d85007c379579e58bba2efe
DIFF: https://github.com/llvm/llvm-project/commit/de8e0a439777014d7d85007c379579e58bba2efe.diff
LOG: ValueTracking: Teach canCreateUndefOrPoison about saturating intrinsics
Added:
Modified:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index ee88074e1145f..a975f1c55d7af 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5263,6 +5263,12 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
case Intrinsic::uadd_with_overflow:
case Intrinsic::usub_with_overflow:
case Intrinsic::umul_with_overflow:
+ case Intrinsic::sadd_sat:
+ case Intrinsic::uadd_sat:
+ case Intrinsic::ssub_sat:
+ case Intrinsic::usub_sat:
+ case Intrinsic::sshl_sat:
+ case Intrinsic::ushl_sat:
case Intrinsic::fma:
case Intrinsic::fmuladd:
case Intrinsic::sqrt:
diff --git a/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll b/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll
index 68d8a33587142..122f4f260eb01 100644
--- a/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll
+++ b/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll
@@ -242,9 +242,9 @@ define i32 @fptosi_sat(float %arg) {
define i32 @sadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @sadd_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.sadd.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
@@ -253,9 +253,9 @@ define i32 @sadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
define i32 @uadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @uadd_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.uadd.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
@@ -264,9 +264,9 @@ define i32 @uadd_sat_i32(i32 %arg0, i32 noundef %arg1) {
define i32 @ssub_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @ssub_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.ssub.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
@@ -275,9 +275,9 @@ define i32 @ssub_sat_i32(i32 %arg0, i32 noundef %arg1) {
define i32 @usub_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @usub_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.usub.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
@@ -286,9 +286,9 @@ define i32 @usub_sat_i32(i32 %arg0, i32 noundef %arg1) {
define i32 @sshl_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @sshl_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.sshl.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
@@ -297,9 +297,9 @@ define i32 @sshl_sat_i32(i32 %arg0, i32 noundef %arg1) {
define i32 @ushl_sat_i32(i32 %arg0, i32 noundef %arg1) {
; CHECK-LABEL: @ushl_sat_i32(
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]])
-; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]]
-; CHECK-NEXT: ret i32 [[FREEZE]]
+; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze i32 [[ARG0:%.*]]
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[ARG0_FR]], i32 [[ARG1:%.*]])
+; CHECK-NEXT: ret i32 [[CALL]]
;
%call = call i32 @llvm.ushl.sat.i32(i32 %arg0, i32 %arg1)
%freeze = freeze i32 %call
More information about the llvm-commits
mailing list