[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / ldexp-ext.ll
blob3fac72a7858e48484984a98967b1ce5ec8bbb9e1
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)
12   ret float %ldexp
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)
23   ret float %ldexp
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)
34   ret double %ldexp
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)
45   ret double %ldexp
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)
67   ret float %ldexp
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)
78   ret float %ldexp
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)
89   ret double %ldexp
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)
100   ret double %ldexp
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