xref: /llvm-project/llvm/test/Transforms/InstCombine/ldexp-ext.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define float @ldexp_zext_float(float %x, i1 %bool) {
5; CHECK-LABEL: @ldexp_zext_float(
6; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], float 2.000000e+00, float 1.000000e+00
7; CHECK-NEXT:    [[LDEXP:%.*]] = fmul float [[X:%.*]], [[TMP1]]
8; CHECK-NEXT:    ret float [[LDEXP]]
9;
10  %zext = zext i1 %bool to i32
11  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %zext)
12  ret float %ldexp
13}
14
15define float @ldexp_zext_float_negative(float %x, i8 %y) {
16; CHECK-LABEL: @ldexp_zext_float_negative(
17; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[Y:%.*]] to i32
18; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[ZEXT]])
19; CHECK-NEXT:    ret float [[LDEXP]]
20;
21  %zext = zext i8 %y to i32
22  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %zext)
23  ret float %ldexp
24}
25
26define double @ldexp_zext_double(double %x, i1 %bool) {
27; CHECK-LABEL: @ldexp_zext_double(
28; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], double 2.000000e+00, double 1.000000e+00
29; CHECK-NEXT:    [[LDEXP:%.*]] = fmul double [[X:%.*]], [[TMP1]]
30; CHECK-NEXT:    ret double [[LDEXP]]
31;
32  %zext = zext i1 %bool to i32
33  %ldexp = call double @llvm.ldexp.f64.i32(double %x, i32 %zext)
34  ret double %ldexp
35}
36
37define double @ldexp_zext_double_fast_math(double %x, i1 %bool) {
38; CHECK-LABEL: @ldexp_zext_double_fast_math(
39; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], double 2.000000e+00, double 1.000000e+00
40; CHECK-NEXT:    [[LDEXP:%.*]] = fmul reassoc double [[X:%.*]], [[TMP1]]
41; CHECK-NEXT:    ret double [[LDEXP]]
42;
43  %zext = zext i1 %bool to i32
44  %ldexp = call reassoc double @llvm.ldexp.f64.i32(double %x, i32 %zext)
45  ret double %ldexp
46}
47
48define <2 x float> @ldexp_zext_float_vector(<2 x float> %x, <2 x i1> %bool) {
49; CHECK-LABEL: @ldexp_zext_float_vector(
50; CHECK-NEXT:    [[TMP1:%.*]] = select <2 x i1> [[BOOL:%.*]], <2 x float> splat (float 2.000000e+00), <2 x float> splat (float 1.000000e+00)
51; CHECK-NEXT:    [[LDEXP:%.*]] = fmul <2 x float> [[X:%.*]], [[TMP1]]
52; CHECK-NEXT:    ret <2 x float> [[LDEXP]]
53;
54  %zext = zext <2 x i1> %bool to <2 x i32>
55  %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %zext)
56  ret <2 x float> %ldexp
57}
58
59define float @ldexp_sext_float(float %x, i1 %bool) {
60; CHECK-LABEL: @ldexp_sext_float(
61; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], float 5.000000e-01, float 1.000000e+00
62; CHECK-NEXT:    [[LDEXP:%.*]] = fmul float [[X:%.*]], [[TMP1]]
63; CHECK-NEXT:    ret float [[LDEXP]]
64;
65  %sext = sext i1 %bool to i32
66  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %sext)
67  ret float %ldexp
68}
69
70define float @ldexp_sext_float_negative(float %x, i8 %y) {
71; CHECK-LABEL: @ldexp_sext_float_negative(
72; CHECK-NEXT:    [[SEXT:%.*]] = sext i8 [[Y:%.*]] to i32
73; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X:%.*]], i32 [[SEXT]])
74; CHECK-NEXT:    ret float [[LDEXP]]
75;
76  %sext = sext i8 %y to i32
77  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %sext)
78  ret float %ldexp
79}
80
81define double @ldexp_sext_double(double %x, i1 %bool) {
82; CHECK-LABEL: @ldexp_sext_double(
83; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], double 5.000000e-01, double 1.000000e+00
84; CHECK-NEXT:    [[LDEXP:%.*]] = fmul double [[X:%.*]], [[TMP1]]
85; CHECK-NEXT:    ret double [[LDEXP]]
86;
87  %sext = sext i1 %bool to i32
88  %ldexp = call double @llvm.ldexp.f64.i32(double %x, i32 %sext)
89  ret double %ldexp
90}
91
92define double @ldexp_sext_double_fast_math(double %x, i1 %bool) {
93; CHECK-LABEL: @ldexp_sext_double_fast_math(
94; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[BOOL:%.*]], double 5.000000e-01, double 1.000000e+00
95; CHECK-NEXT:    [[LDEXP:%.*]] = fmul reassoc double [[X:%.*]], [[TMP1]]
96; CHECK-NEXT:    ret double [[LDEXP]]
97;
98  %sext = sext i1 %bool to i32
99  %ldexp = call reassoc double @llvm.ldexp.f64.i32(double %x, i32 %sext)
100  ret double %ldexp
101}
102
103define <2 x float> @ldexp_sext_float_vector(<2 x float> %x, <2 x i1> %bool) {
104; CHECK-LABEL: @ldexp_sext_float_vector(
105; CHECK-NEXT:    [[TMP1:%.*]] = select <2 x i1> [[BOOL:%.*]], <2 x float> splat (float 5.000000e-01), <2 x float> splat (float 1.000000e+00)
106; CHECK-NEXT:    [[LDEXP:%.*]] = fmul <2 x float> [[X:%.*]], [[TMP1]]
107; CHECK-NEXT:    ret <2 x float> [[LDEXP]]
108;
109  %sext = sext <2 x i1> %bool to <2 x i32>
110  %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %sext)
111  ret <2 x float> %ldexp
112}
113