[llvm] 516eb38 - [ExpandIRInsts] Freeze value before fptoi expansion (#179659)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 4 05:49:39 PST 2026
Author: Nikita Popov
Date: 2026-02-04T14:49:34+01:00
New Revision: 516eb3820db80cd706722af566897650bc949df7
URL: https://github.com/llvm/llvm-project/commit/516eb3820db80cd706722af566897650bc949df7
DIFF: https://github.com/llvm/llvm-project/commit/516eb3820db80cd706722af566897650bc949df7.diff
LOG: [ExpandIRInsts] Freeze value before fptoi expansion (#179659)
We're going to introduce new branches, and branch on undef/poison
is immediate UB.
Added:
Modified:
llvm/lib/CodeGen/ExpandIRInsts.cpp
llvm/test/Transforms/ExpandIRInsts/X86/expand-fp-convert-small.ll
llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptosi129.ll
llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptoui129.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/ExpandIRInsts.cpp b/llvm/lib/CodeGen/ExpandIRInsts.cpp
index 6cbdda6b9870e..af8dc03ff8037 100644
--- a/llvm/lib/CodeGen/ExpandIRInsts.cpp
+++ b/llvm/lib/CodeGen/ExpandIRInsts.cpp
@@ -554,13 +554,15 @@ static void expandFPToI(Instruction *FPToI) {
// entry:
Builder.SetInsertPoint(Entry);
- Value *FloatVal0 = FloatVal;
+ // We're going to introduce branches on the value, so freeze it.
+ if (!isGuaranteedNotToBeUndefOrPoison(FloatVal))
+ FloatVal = Builder.CreateFreeze(FloatVal);
// fp80 conversion is implemented by fpext to fp128 first then do the
// conversion.
if (FloatVal->getType()->isX86_FP80Ty())
- FloatVal0 =
+ FloatVal =
Builder.CreateFPExt(FloatVal, Type::getFP128Ty(Builder.getContext()));
- Value *ARep = Builder.CreateBitCast(FloatVal0, FloatIntTy);
+ Value *ARep = Builder.CreateBitCast(FloatVal, FloatIntTy);
Value *PosOrNeg =
Builder.CreateICmpSGT(ARep, ConstantInt::getSigned(FloatIntTy, -1));
Value *Sign = Builder.CreateSelect(PosOrNeg, ConstantInt::getSigned(IntTy, 1),
diff --git a/llvm/test/Transforms/ExpandIRInsts/X86/expand-fp-convert-small.ll b/llvm/test/Transforms/ExpandIRInsts/X86/expand-fp-convert-small.ll
index 467bf76e7320b..9a3a4860b506b 100644
--- a/llvm/test/Transforms/ExpandIRInsts/X86/expand-fp-convert-small.ll
+++ b/llvm/test/Transforms/ExpandIRInsts/X86/expand-fp-convert-small.ll
@@ -7,6 +7,48 @@ define i16 @fptosi_f16_i16(half %x) {
; CHECK-LABEL: define i16 @fptosi_f16_i16(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
+; CHECK-NEXT: [[TMP13:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP13]] to i16
+; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i16 [[TMP0]], -1
+; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP1]], i16 1, i16 -1
+; CHECK-NEXT: [[TMP2:%.*]] = lshr i16 [[TMP0]], 10
+; CHECK-NEXT: [[BIASED_EXP:%.*]] = and i16 [[TMP2]], 31
+; CHECK-NEXT: [[TMP3:%.*]] = and i16 [[TMP0]], 1023
+; CHECK-NEXT: [[SIGNIFICAND:%.*]] = or i16 [[TMP3]], 1024
+; CHECK-NEXT: [[EXP_IS_NEGATIVE:%.*]] = icmp ult i16 [[BIASED_EXP]], 15
+; CHECK-NEXT: br i1 [[EXP_IS_NEGATIVE]], label %[[FP_TO_I_CLEANUP:.*]], label %[[FP_TO_I_IF_CHECK_SATURATE:.*]]
+; CHECK: [[FP_TO_I_IF_CHECK_SATURATE]]:
+; CHECK-NEXT: [[TMP4:%.*]] = add i16 [[BIASED_EXP]], -31
+; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i16 [[TMP4]], -16
+; CHECK-NEXT: br i1 [[TMP5]], label %[[FP_TO_I_IF_SATURATE:.*]], label %[[FP_TO_I_IF_CHECK_EXP_SIZE:.*]]
+; CHECK: [[FP_TO_I_IF_SATURATE]]:
+; CHECK-NEXT: [[SATURATED:%.*]] = select i1 [[TMP1]], i16 32767, i16 -32768
+; CHECK-NEXT: br label %[[FP_TO_I_CLEANUP]]
+; CHECK: [[FP_TO_I_IF_CHECK_EXP_SIZE]]:
+; CHECK-NEXT: [[EXP_SMALLER_MANTISSA_WIDTH:%.*]] = icmp ult i16 [[BIASED_EXP]], 25
+; CHECK-NEXT: br i1 [[EXP_SMALLER_MANTISSA_WIDTH]], label %[[FP_TO_I_IF_EXP_SMALL:.*]], label %[[FP_TO_I_IF_EXP_LARGE:.*]]
+; CHECK: [[FP_TO_I_IF_EXP_SMALL]]:
+; CHECK-NEXT: [[TMP6:%.*]] = sub i16 25, [[BIASED_EXP]]
+; CHECK-NEXT: [[TMP7:%.*]] = lshr i16 [[SIGNIFICAND]], [[TMP6]]
+; CHECK-NEXT: [[TMP8:%.*]] = mul i16 [[TMP7]], [[SIGN]]
+; CHECK-NEXT: br label %[[FP_TO_I_CLEANUP]]
+; CHECK: [[FP_TO_I_IF_EXP_LARGE]]:
+; CHECK-NEXT: [[TMP9:%.*]] = add i16 [[BIASED_EXP]], -25
+; CHECK-NEXT: [[TMP10:%.*]] = shl i16 [[SIGNIFICAND]], [[TMP9]]
+; CHECK-NEXT: [[TMP11:%.*]] = mul i16 [[TMP10]], [[SIGN]]
+; CHECK-NEXT: br label %[[FP_TO_I_CLEANUP]]
+; CHECK: [[FP_TO_I_CLEANUP]]:
+; CHECK-NEXT: [[TMP12:%.*]] = phi i16 [ [[SATURATED]], %[[FP_TO_I_IF_SATURATE]] ], [ [[TMP8]], %[[FP_TO_I_IF_EXP_SMALL]] ], [ [[TMP11]], %[[FP_TO_I_IF_EXP_LARGE]] ], [ 0, %[[FP_TO_I_ENTRY]] ]
+; CHECK-NEXT: ret i16 [[TMP12]]
+;
+ %res = fptosi half %x to i16
+ ret i16 %res
+}
+
+define i16 @fptosi_f16_i16_noundef(half noundef %x) {
+; CHECK-LABEL: define i16 @fptosi_f16_i16_noundef(
+; CHECK-SAME: half noundef [[X:%.*]]) {
+; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP1]], i16 1, i16 -1
@@ -48,7 +90,8 @@ define i24 @fptosi_f16_i24(half %x) {
; CHECK-LABEL: define i24 @fptosi_f16_i24(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
+; CHECK-NEXT: [[TMP1:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP1]] to i16
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i24 1, i24 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i16 [[TMP0]], 10
@@ -92,7 +135,8 @@ define i8 @fptosi_f16_i8(half %x) {
; CHECK-LABEL: define i8 @fptosi_f16_i8(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
+; CHECK-NEXT: [[TMP16:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP16]] to i16
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP1]], i8 1, i8 -1
; CHECK-NEXT: [[TMP2:%.*]] = lshr i16 [[TMP0]], 10
@@ -136,7 +180,8 @@ define i16 @fptoui_f16_i16(half %x) {
; CHECK-LABEL: define i16 @fptoui_f16_i16(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
+; CHECK-NEXT: [[TMP13:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP13]] to i16
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP1]], i16 1, i16 -1
; CHECK-NEXT: [[TMP2:%.*]] = lshr i16 [[TMP0]], 10
@@ -177,7 +222,8 @@ define i24 @fptoui_f16_i24(half %x) {
; CHECK-LABEL: define i24 @fptoui_f16_i24(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
+; CHECK-NEXT: [[TMP1:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP1]] to i16
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i24 1, i24 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i16 [[TMP0]], 10
@@ -221,7 +267,8 @@ define i8 @fptoui_f16_i8(half %x) {
; CHECK-LABEL: define i8 @fptoui_f16_i8(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[FP_TO_I_ENTRY:.*]]:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
+; CHECK-NEXT: [[TMP16:%.*]] = freeze half [[X]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[TMP16]] to i16
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i16 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP1]], i8 1, i8 -1
; CHECK-NEXT: [[TMP2:%.*]] = lshr i16 [[TMP0]], 10
diff --git a/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptosi129.ll b/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptosi129.ll
index 24c1476fdb512..97268e5d6917b 100644
--- a/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptosi129.ll
+++ b/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptosi129.ll
@@ -15,7 +15,8 @@ define i129 @halftosi129(half %a) {
define i129 @floattosi129(float %a) {
; CHECK-LABEL: @floattosi129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A:%.*]] to i32
+; CHECK-NEXT: [[A:%.*]] = freeze float [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A]] to i32
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i32 [[TMP0]], 23
@@ -58,7 +59,8 @@ define i129 @floattosi129(float %a) {
define i129 @doubletosi129(double %a) {
; CHECK-LABEL: @doubletosi129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[A:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = freeze double [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[A]] to i64
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP0]], 52
@@ -101,7 +103,8 @@ define i129 @doubletosi129(double %a) {
define i129 @x86_fp80tosi129(x86_fp80 %a) {
; CHECK-LABEL: @x86_fp80tosi129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = fpext x86_fp80 [[A:%.*]] to fp128
+; CHECK-NEXT: [[A:%.*]] = freeze x86_fp80 [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = fpext x86_fp80 [[A]] to fp128
; CHECK-NEXT: [[TMP1:%.*]] = bitcast fp128 [[TMP0]] to i128
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i128 [[TMP1]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP3]], i129 1, i129 -1
@@ -145,7 +148,8 @@ define i129 @x86_fp80tosi129(x86_fp80 %a) {
define i129 @fp128tosi129(fp128 %a) {
; CHECK-LABEL: @fp128tosi129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast fp128 [[A:%.*]] to i128
+; CHECK-NEXT: [[A:%.*]] = freeze fp128 [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast fp128 [[A]] to i128
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i128 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i128 [[TMP0]], 112
@@ -189,7 +193,8 @@ define <2 x i129> @floattosi129v2(<2 x float> %a) {
; CHECK-LABEL: @floattosi129v2(
; CHECK-NEXT: fp-to-i-entryfp-to-i-entry:
; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x float> [[A:%.*]], i64 0
-; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP0]] to i32
+; CHECK-NEXT: [[TMP2:%.*]] = freeze float [[TMP0]]
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP2]] to i32
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], -1
; CHECK-NEXT: [[SIGN7:%.*]] = select i1 [[TMP3]], i129 1, i129 -1
; CHECK-NEXT: [[TMP6:%.*]] = lshr i32 [[TMP1]], 23
@@ -225,7 +230,8 @@ define <2 x i129> @floattosi129v2(<2 x float> %a) {
; CHECK-NEXT: [[TMP14:%.*]] = phi i129 [ [[SATURATED11]], [[FP_TO_I_IF_SATURATE3]] ], [ [[TMP10]], [[FP_TO_I_IF_EXP_SMALL5]] ], [ [[TMP13]], [[FP_TO_I_IF_EXP_LARGE6]] ], [ 0, [[FP_TO_I_ENTRYFP_TO_I_ENTRY:%.*]] ]
; CHECK-NEXT: [[TMP15:%.*]] = insertelement <2 x i129> poison, i129 [[TMP14]], i64 0
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x float> [[A]], i64 1
-; CHECK-NEXT: [[TMP17:%.*]] = bitcast float [[TMP16]] to i32
+; CHECK-NEXT: [[TMP35:%.*]] = freeze float [[TMP16]]
+; CHECK-NEXT: [[TMP17:%.*]] = bitcast float [[TMP35]] to i32
; CHECK-NEXT: [[TMP19:%.*]] = icmp sgt i32 [[TMP17]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP19]], i129 1, i129 -1
; CHECK-NEXT: [[TMP21:%.*]] = lshr i32 [[TMP17]], 23
diff --git a/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptoui129.ll b/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptoui129.ll
index fd29c01ef580d..5afff792c1508 100644
--- a/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptoui129.ll
+++ b/llvm/test/Transforms/ExpandIRInsts/X86/expand-large-fp-convert-fptoui129.ll
@@ -15,7 +15,8 @@ define i129 @halftoui129(half %a) {
define i129 @floattoui129(float %a) {
; CHECK-LABEL: @floattoui129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A:%.*]] to i32
+; CHECK-NEXT: [[A:%.*]] = freeze float [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A]] to i32
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i32 [[TMP0]], 23
@@ -58,7 +59,8 @@ define i129 @floattoui129(float %a) {
define i129 @doubletoui129(double %a) {
; CHECK-LABEL: @doubletoui129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[A:%.*]] to i64
+; CHECK-NEXT: [[A:%.*]] = freeze double [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[A]] to i64
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP0]], 52
@@ -101,7 +103,8 @@ define i129 @doubletoui129(double %a) {
define i129 @x86_fp80toui129(x86_fp80 %a) {
; CHECK-LABEL: @x86_fp80toui129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = fpext x86_fp80 [[A:%.*]] to fp128
+; CHECK-NEXT: [[A:%.*]] = freeze x86_fp80 [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = fpext x86_fp80 [[A]] to fp128
; CHECK-NEXT: [[TMP1:%.*]] = bitcast fp128 [[TMP0]] to i128
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i128 [[TMP1]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP3]], i129 1, i129 -1
@@ -145,7 +148,8 @@ define i129 @x86_fp80toui129(x86_fp80 %a) {
define i129 @fp128toui129(fp128 %a) {
; CHECK-LABEL: @fp128toui129(
; CHECK-NEXT: fp-to-i-entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast fp128 [[A:%.*]] to i128
+; CHECK-NEXT: [[A:%.*]] = freeze fp128 [[A1:%.*]]
+; CHECK-NEXT: [[TMP0:%.*]] = bitcast fp128 [[A]] to i128
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i128 [[TMP0]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
; CHECK-NEXT: [[TMP5:%.*]] = lshr i128 [[TMP0]], 112
@@ -189,7 +193,8 @@ define <2 x i129> @floattoui129v2(<2 x float> %a) {
; CHECK-LABEL: @floattoui129v2(
; CHECK-NEXT: fp-to-i-entryfp-to-i-entry:
; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x float> [[A:%.*]], i64 0
-; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP0]] to i32
+; CHECK-NEXT: [[TMP2:%.*]] = freeze float [[TMP0]]
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP2]] to i32
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], -1
; CHECK-NEXT: [[SIGN7:%.*]] = select i1 [[TMP3]], i129 1, i129 -1
; CHECK-NEXT: [[TMP6:%.*]] = lshr i32 [[TMP1]], 23
@@ -225,7 +230,8 @@ define <2 x i129> @floattoui129v2(<2 x float> %a) {
; CHECK-NEXT: [[TMP14:%.*]] = phi i129 [ [[SATURATED11]], [[FP_TO_I_IF_SATURATE3]] ], [ [[TMP10]], [[FP_TO_I_IF_EXP_SMALL5]] ], [ [[TMP13]], [[FP_TO_I_IF_EXP_LARGE6]] ], [ 0, [[FP_TO_I_ENTRYFP_TO_I_ENTRY:%.*]] ]
; CHECK-NEXT: [[TMP15:%.*]] = insertelement <2 x i129> poison, i129 [[TMP14]], i64 0
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x float> [[A]], i64 1
-; CHECK-NEXT: [[TMP17:%.*]] = bitcast float [[TMP16]] to i32
+; CHECK-NEXT: [[TMP35:%.*]] = freeze float [[TMP16]]
+; CHECK-NEXT: [[TMP17:%.*]] = bitcast float [[TMP35]] to i32
; CHECK-NEXT: [[TMP19:%.*]] = icmp sgt i32 [[TMP17]], -1
; CHECK-NEXT: [[SIGN:%.*]] = select i1 [[TMP19]], i129 1, i129 -1
; CHECK-NEXT: [[TMP21:%.*]] = lshr i32 [[TMP17]], 23
More information about the llvm-commits
mailing list