[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