Loading llvm/lib/Analysis/ValueTracking.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -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: Loading llvm/test/Transforms/InstCombine/freeze-fp-ops.ll +38 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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) Loading
llvm/lib/Analysis/ValueTracking.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -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: Loading
llvm/test/Transforms/InstCombine/freeze-fp-ops.ll +38 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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)