1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4 define 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]]
10 %zext = zext i1 %bool to i32
11 %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %zext)
15 define 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]]
21 %zext = zext i8 %y to i32
22 %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %zext)
26 define 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]]
32 %zext = zext i1 %bool to i32
33 %ldexp = call double @llvm.ldexp.f64.i32(double %x, i32 %zext)
37 define 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]]
43 %zext = zext i1 %bool to i32
44 %ldexp = call reassoc double @llvm.ldexp.f64.i32(double %x, i32 %zext)
48 define <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]]
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
59 define 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]]
65 %sext = sext i1 %bool to i32
66 %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %sext)
70 define 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]]
76 %sext = sext i8 %y to i32
77 %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %sext)
81 define 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]]
87 %sext = sext i1 %bool to i32
88 %ldexp = call double @llvm.ldexp.f64.i32(double %x, i32 %sext)
92 define 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]]
98 %sext = sext i1 %bool to i32
99 %ldexp = call reassoc double @llvm.ldexp.f64.i32(double %x, i32 %sext)
103 define <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]]
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