[llvm] e86be1f - ValueTracking: frexp never introduces poison

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 11 16:55:05 PDT 2023


Author: Matt Arsenault
Date: 2023-08-11T19:54:58-04:00
New Revision: e86be1fd303ec3bed3b8ff8e7e871aa06e3d23fb

URL: https://github.com/llvm/llvm-project/commit/e86be1fd303ec3bed3b8ff8e7e871aa06e3d23fb
DIFF: https://github.com/llvm/llvm-project/commit/e86be1fd303ec3bed3b8ff8e7e871aa06e3d23fb.diff

LOG: ValueTracking: frexp never introduces poison

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp
    llvm/test/Transforms/InstCombine/freeze-fp-ops.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index d8f710e26d435a..87014a4a6b15e8 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6582,6 +6582,7 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
       case Intrinsic::maximum:
       case Intrinsic::is_fpclass:
       case Intrinsic::ldexp:
+      case Intrinsic::frexp:
         return false;
       case Intrinsic::lround:
       case Intrinsic::llround:

diff  --git a/llvm/test/Transforms/InstCombine/freeze-fp-ops.ll b/llvm/test/Transforms/InstCombine/freeze-fp-ops.ll
index 504ad171cef140..d3525b716ec71f 100644
--- a/llvm/test/Transforms/InstCombine/freeze-fp-ops.ll
+++ b/llvm/test/Transforms/InstCombine/freeze-fp-ops.ll
@@ -528,6 +528,43 @@ define float @freeze_ldexp(float %arg0, i32 noundef %arg1) {
   ret float %freeze
 }
 
+define { float, i32 } @freeze_frexp(float %arg0) {
+; CHECK-LABEL: @freeze_frexp(
+; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
+; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
+; CHECK-NEXT:    ret { float, i32 } [[OP]]
+;
+  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
+  %freeze = freeze { float, i32 } %op
+  ret { float, i32 } %freeze
+}
+
+define float @freeze_frexp_0(float %arg0) {
+; CHECK-LABEL: @freeze_frexp_0(
+; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
+; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
+; CHECK-NEXT:    [[EXTRACT_0:%.*]] = extractvalue { float, i32 } [[OP]], 0
+; CHECK-NEXT:    ret float [[EXTRACT_0]]
+;
+  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
+  %extract.0 = extractvalue { float, i32 } %op, 0
+  %freeze = freeze float %extract.0
+  ret float %freeze
+}
+
+define i32 @freeze_frexp_1(float %arg0) {
+; CHECK-LABEL: @freeze_frexp_1(
+; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
+; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
+; CHECK-NEXT:    [[EXTRACT_1:%.*]] = extractvalue { float, i32 } [[OP]], 1
+; CHECK-NEXT:    ret i32 [[EXTRACT_1]]
+;
+  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
+  %extract.1 = extractvalue { float, i32 } %op, 1
+  %freeze = freeze i32 %extract.1
+  ret i32 %freeze
+}
+
 declare float @llvm.fma.f32(float, float, float)
 declare float @llvm.fmuladd.f32(float, float, float)
 declare float @llvm.sqrt.f32(float)
@@ -562,3 +599,4 @@ declare float @llvm.maximum.f32(float, float)
 declare i1 @llvm.is.fpclass.f32(float, i32 immarg)
 declare float @llvm.fptrunc.round.f32.f64(double, metadata)
 declare float @llvm.ldexp.f32.i32(float, i32)
+declare { float, i32 } @llvm.frexp.f32.i32(float)


        


More information about the llvm-commits mailing list