Skip to content

Commit 3d07200

Browse files
committed
InstCombine: Emit ldexp intrinsic in exp2->ldexp combine
Prefer to emit the intrinsic over a libcall in the intrinsic or no-math-errno case.
1 parent 1168316 commit 3d07200

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,12 +2389,21 @@ Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) {
23892389
if ((isa<SIToFPInst>(Op) || isa<UIToFPInst>(Op)) &&
23902390
hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl)) {
23912391
if (Value *Exp = getIntToFPVal(Op, B, TLI->getIntSize())) {
2392+
Constant *One = ConstantFP::get(Ty, 1.0);
2393+
2394+
// TODO: Emitting the intrinsic should not depend on whether the libcall
2395+
// is available.
2396+
if (CI->doesNotAccessMemory()) {
2397+
return copyFlags(*CI, B.CreateIntrinsic(Intrinsic::ldexp,
2398+
{Ty, Exp->getType()},
2399+
{One, Exp}, CI));
2400+
}
2401+
23922402
IRBuilderBase::FastMathFlagGuard Guard(B);
23932403
B.setFastMathFlags(CI->getFastMathFlags());
2394-
return copyFlags(
2395-
*CI, emitBinaryFloatFnCall(ConstantFP::get(Ty, 1.0), Exp, TLI,
2396-
LibFunc_ldexp, LibFunc_ldexpf,
2397-
LibFunc_ldexpl, B, AttributeList()));
2404+
return copyFlags(*CI, emitBinaryFloatFnCall(
2405+
One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2406+
LibFunc_ldexpl, B, AttributeList()));
23982407
}
23992408
}
24002409

llvm/test/Transforms/InstCombine/exp2-1.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -228,18 +228,18 @@ define float @test_simplify8(i8 zeroext %x) {
228228
define double @test_simplify9(i8 zeroext %x) {
229229
; LDEXP32-LABEL: @test_simplify9(
230230
; LDEXP32-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
231-
; LDEXP32-NEXT: [[LDEXP:%.*]] = call double @ldexp(double 1.000000e+00, i32 [[TMP1]])
232-
; LDEXP32-NEXT: ret double [[LDEXP]]
231+
; LDEXP32-NEXT: [[RET:%.*]] = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 [[TMP1]])
232+
; LDEXP32-NEXT: ret double [[RET]]
233233
;
234234
; LDEXP16-LABEL: @test_simplify9(
235235
; LDEXP16-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i16
236-
; LDEXP16-NEXT: [[LDEXP:%.*]] = call double @ldexp(double 1.000000e+00, i16 [[TMP1]])
237-
; LDEXP16-NEXT: ret double [[LDEXP]]
236+
; LDEXP16-NEXT: [[RET:%.*]] = call double @llvm.ldexp.f64.i16(double 1.000000e+00, i16 [[TMP1]])
237+
; LDEXP16-NEXT: ret double [[RET]]
238238
;
239239
; NOLDEXPF-LABEL: @test_simplify9(
240240
; NOLDEXPF-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
241-
; NOLDEXPF-NEXT: [[LDEXP:%.*]] = call double @ldexp(double 1.000000e+00, i32 [[TMP1]])
242-
; NOLDEXPF-NEXT: ret double [[LDEXP]]
241+
; NOLDEXPF-NEXT: [[RET:%.*]] = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 [[TMP1]])
242+
; NOLDEXPF-NEXT: ret double [[RET]]
243243
;
244244
; NOLDEXP-LABEL: @test_simplify9(
245245
; NOLDEXP-NEXT: [[CONV:%.*]] = uitofp i8 [[X:%.*]] to double
@@ -254,13 +254,13 @@ define double @test_simplify9(i8 zeroext %x) {
254254
define float @test_simplify10(i8 zeroext %x) {
255255
; LDEXP32-LABEL: @test_simplify10(
256256
; LDEXP32-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
257-
; LDEXP32-NEXT: [[LDEXPF:%.*]] = call float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
258-
; LDEXP32-NEXT: ret float [[LDEXPF]]
257+
; LDEXP32-NEXT: [[RET:%.*]] = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 [[TMP1]])
258+
; LDEXP32-NEXT: ret float [[RET]]
259259
;
260260
; LDEXP16-LABEL: @test_simplify10(
261261
; LDEXP16-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i16
262-
; LDEXP16-NEXT: [[LDEXPF:%.*]] = call float @ldexpf(float 1.000000e+00, i16 [[TMP1]])
263-
; LDEXP16-NEXT: ret float [[LDEXPF]]
262+
; LDEXP16-NEXT: [[RET:%.*]] = call float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[TMP1]])
263+
; LDEXP16-NEXT: ret float [[RET]]
264264
;
265265
; NOLDEXPF-LABEL: @test_simplify10(
266266
; NOLDEXPF-NEXT: [[CONV:%.*]] = uitofp i8 [[X:%.*]] to float
@@ -280,13 +280,13 @@ define float @test_simplify10(i8 zeroext %x) {
280280
define float @sitofp_scalar_intrinsic_with_FMF(i8 %x) {
281281
; LDEXP32-LABEL: @sitofp_scalar_intrinsic_with_FMF(
282282
; LDEXP32-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i32
283-
; LDEXP32-NEXT: [[LDEXPF:%.*]] = tail call nnan float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
284-
; LDEXP32-NEXT: ret float [[LDEXPF]]
283+
; LDEXP32-NEXT: [[R:%.*]] = tail call nnan float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 [[TMP1]])
284+
; LDEXP32-NEXT: ret float [[R]]
285285
;
286286
; LDEXP16-LABEL: @sitofp_scalar_intrinsic_with_FMF(
287287
; LDEXP16-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i16
288-
; LDEXP16-NEXT: [[LDEXPF:%.*]] = tail call nnan float @ldexpf(float 1.000000e+00, i16 [[TMP1]])
289-
; LDEXP16-NEXT: ret float [[LDEXPF]]
288+
; LDEXP16-NEXT: [[R:%.*]] = tail call nnan float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[TMP1]])
289+
; LDEXP16-NEXT: ret float [[R]]
290290
;
291291
; NOLDEXPF-LABEL: @sitofp_scalar_intrinsic_with_FMF(
292292
; NOLDEXPF-NEXT: [[S:%.*]] = sitofp i8 [[X:%.*]] to float

llvm/test/Transforms/InstCombine/exp2-to-ldexp.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ define float @exp2_f32_sitofp_i8(i8 %x) {
66
; LDEXP-LABEL: define float @exp2_f32_sitofp_i8(
77
; LDEXP-SAME: i8 [[X:%.*]]) {
88
; LDEXP-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
9-
; LDEXP-NEXT: [[LDEXPF:%.*]] = call float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
9+
; LDEXP-NEXT: [[LDEXPF:%.*]] = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 [[TMP1]])
1010
; LDEXP-NEXT: ret float [[LDEXPF]]
1111
;
1212
; NOLDEXP-LABEL: define float @exp2_f32_sitofp_i8(
@@ -24,7 +24,7 @@ define float @exp2_f32_sitofp_i8_flags(i8 %x) {
2424
; LDEXP-LABEL: define float @exp2_f32_sitofp_i8_flags(
2525
; LDEXP-SAME: i8 [[X:%.*]]) {
2626
; LDEXP-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
27-
; LDEXP-NEXT: [[LDEXPF:%.*]] = call nnan ninf float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
27+
; LDEXP-NEXT: [[LDEXPF:%.*]] = call nnan ninf float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 [[TMP1]])
2828
; LDEXP-NEXT: ret float [[LDEXPF]]
2929
;
3030
; NOLDEXP-LABEL: define float @exp2_f32_sitofp_i8_flags(
@@ -54,7 +54,7 @@ define float @exp2_f32_uitofp_i8(i8 %x) {
5454
; LDEXP-LABEL: define float @exp2_f32_uitofp_i8(
5555
; LDEXP-SAME: i8 [[X:%.*]]) {
5656
; LDEXP-NEXT: [[TMP1:%.*]] = zext i8 [[X]] to i32
57-
; LDEXP-NEXT: [[LDEXPF:%.*]] = call float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
57+
; LDEXP-NEXT: [[LDEXPF:%.*]] = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 [[TMP1]])
5858
; LDEXP-NEXT: ret float [[LDEXPF]]
5959
;
6060
; NOLDEXP-LABEL: define float @exp2_f32_uitofp_i8(
@@ -84,7 +84,7 @@ define double @exp2_f64_sitofp_i8(i8 %x) {
8484
; LDEXP-LABEL: define double @exp2_f64_sitofp_i8(
8585
; LDEXP-SAME: i8 [[X:%.*]]) {
8686
; LDEXP-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
87-
; LDEXP-NEXT: [[LDEXP:%.*]] = call double @ldexp(double 1.000000e+00, i32 [[TMP1]])
87+
; LDEXP-NEXT: [[LDEXP:%.*]] = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 [[TMP1]])
8888
; LDEXP-NEXT: ret double [[LDEXP]]
8989
;
9090
; NOLDEXP-LABEL: define double @exp2_f64_sitofp_i8(
@@ -102,7 +102,7 @@ define fp128 @exp2_fp128_sitofp_i8(i8 %x) {
102102
; LDEXP-LABEL: define fp128 @exp2_fp128_sitofp_i8(
103103
; LDEXP-SAME: i8 [[X:%.*]]) {
104104
; LDEXP-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32
105-
; LDEXP-NEXT: [[LDEXPL:%.*]] = call fp128 @ldexpl(fp128 0xL00000000000000003FFF000000000000, i32 [[TMP1]])
105+
; LDEXP-NEXT: [[LDEXPL:%.*]] = call fp128 @llvm.ldexp.f128.i32(fp128 0xL00000000000000003FFF000000000000, i32 [[TMP1]])
106106
; LDEXP-NEXT: ret fp128 [[LDEXPL]]
107107
;
108108
; NOLDEXP-LABEL: define fp128 @exp2_fp128_sitofp_i8(

0 commit comments

Comments
 (0)