1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 define float @select_fadd(i1 %cond, float %A, float %B) {
5 ; CHECK-LABEL: @select_fadd(
6 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
7 ; CHECK-NEXT: [[D:%.*]] = fadd float [[C]], [[A:%.*]]
8 ; CHECK-NEXT: ret float [[D]]
10 %C = fadd float %A, %B
11 %D = select i1 %cond, float %C, float %A
15 define float @select_fadd_swapped(i1 %cond, float %A, float %B) {
16 ; CHECK-LABEL: @select_fadd_swapped(
17 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
18 ; CHECK-NEXT: [[D:%.*]] = fadd float [[C]], [[A:%.*]]
19 ; CHECK-NEXT: ret float [[D]]
21 %C = fadd float %A, %B
22 %D = select i1 %cond, float %A, float %C
26 define float @select_fadd_fast_math(i1 %cond, float %A, float %B) {
27 ; CHECK-LABEL: @select_fadd_fast_math(
28 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
29 ; CHECK-NEXT: [[D:%.*]] = fadd fast float [[C]], [[A:%.*]]
30 ; CHECK-NEXT: ret float [[D]]
32 %C = fadd fast float %A, %B
33 %D = select i1 %cond, float %C, float %A
37 define float @select_fadd_swapped_fast_math(i1 %cond, float %A, float %B) {
38 ; CHECK-LABEL: @select_fadd_swapped_fast_math(
39 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
40 ; CHECK-NEXT: [[D:%.*]] = fadd fast float [[C]], [[A:%.*]]
41 ; CHECK-NEXT: ret float [[D]]
43 %C = fadd fast float %A, %B
44 %D = select i1 %cond, float %A, float %C
48 define float @select_fmul(i1 %cond, float %A, float %B) {
49 ; CHECK-LABEL: @select_fmul(
50 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
51 ; CHECK-NEXT: [[D:%.*]] = fmul float [[C]], [[A:%.*]]
52 ; CHECK-NEXT: ret float [[D]]
54 %C = fmul float %A, %B
55 %D = select i1 %cond, float %C, float %A
59 define float @select_fmul_swapped(i1 %cond, float %A, float %B) {
60 ; CHECK-LABEL: @select_fmul_swapped(
61 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
62 ; CHECK-NEXT: [[D:%.*]] = fmul float [[C]], [[A:%.*]]
63 ; CHECK-NEXT: ret float [[D]]
65 %C = fmul float %A, %B
66 %D = select i1 %cond, float %A, float %C
70 define float @select_fmul_fast_math(i1 %cond, float %A, float %B) {
71 ; CHECK-LABEL: @select_fmul_fast_math(
72 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
73 ; CHECK-NEXT: [[D:%.*]] = fmul fast float [[C]], [[A:%.*]]
74 ; CHECK-NEXT: ret float [[D]]
76 %C = fmul fast float %A, %B
77 %D = select i1 %cond, float %C, float %A
81 define float @select_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {
82 ; CHECK-LABEL: @select_fmul_swapped_fast_math(
83 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
84 ; CHECK-NEXT: [[D:%.*]] = fmul fast float [[C]], [[A:%.*]]
85 ; CHECK-NEXT: ret float [[D]]
87 %C = fmul fast float %A, %B
88 %D = select i1 %cond, float %A, float %C
92 define float @select_fsub(i1 %cond, float %A, float %B) {
93 ; CHECK-LABEL: @select_fsub(
94 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
95 ; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
96 ; CHECK-NEXT: ret float [[D]]
98 %C = fsub float %A, %B
99 %D = select i1 %cond, float %C, float %A
103 define float @select_fsub_swapped(i1 %cond, float %A, float %B) {
104 ; CHECK-LABEL: @select_fsub_swapped(
105 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
106 ; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
107 ; CHECK-NEXT: ret float [[D]]
109 %C = fsub float %A, %B
110 %D = select i1 %cond, float %A, float %C
114 define float @select_fsub_fast_math(i1 %cond, float %A, float %B) {
115 ; CHECK-LABEL: @select_fsub_fast_math(
116 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
117 ; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
118 ; CHECK-NEXT: ret float [[D]]
120 %C = fsub fast float %A, %B
121 %D = select i1 %cond, float %C, float %A
125 define float @select_fsub_swapped_fast_math(i1 %cond, float %A, float %B) {
126 ; CHECK-LABEL: @select_fsub_swapped_fast_math(
127 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
128 ; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
129 ; CHECK-NEXT: ret float [[D]]
131 %C = fsub fast float %A, %B
132 %D = select i1 %cond, float %A, float %C
136 ; 'fsub' can only fold on the amount subtracted.
137 define float @select_fsub_invalid(i1 %cond, float %A, float %B) {
138 ; CHECK-LABEL: @select_fsub_invalid(
139 ; CHECK-NEXT: [[C:%.*]] = fsub float [[B:%.*]], [[A:%.*]]
140 ; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
141 ; CHECK-NEXT: ret float [[D]]
143 %C = fsub float %B, %A
144 %D = select i1 %cond, float %C, float %A
148 define float @select_fdiv(i1 %cond, float %A, float %B) {
149 ; CHECK-LABEL: @select_fdiv(
150 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
151 ; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]
152 ; CHECK-NEXT: ret float [[D]]
154 %C = fdiv float %A, %B
155 %D = select i1 %cond, float %C, float %A
159 define float @select_fdiv_swapped(i1 %cond, float %A, float %B) {
160 ; CHECK-LABEL: @select_fdiv_swapped(
161 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
162 ; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]
163 ; CHECK-NEXT: ret float [[D]]
165 %C = fdiv float %A, %B
166 %D = select i1 %cond, float %A, float %C
170 define float @select_fdiv_fast_math(i1 %cond, float %A, float %B) {
171 ; CHECK-LABEL: @select_fdiv_fast_math(
172 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
173 ; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
174 ; CHECK-NEXT: ret float [[D]]
176 %C = fdiv fast float %A, %B
177 %D = select i1 %cond, float %C, float %A
181 define float @select_fdiv_swapped_fast_math(i1 %cond, float %A, float %B) {
182 ; CHECK-LABEL: @select_fdiv_swapped_fast_math(
183 ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
184 ; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
185 ; CHECK-NEXT: ret float [[D]]
187 %C = fdiv fast float %A, %B
188 %D = select i1 %cond, float %A, float %C
192 ; 'fdiv' can only fold on the divisor amount.
193 define float @select_fdiv_invalid(i1 %cond, float %A, float %B) {
194 ; CHECK-LABEL: @select_fdiv_invalid(
195 ; CHECK-NEXT: [[C:%.*]] = fdiv float [[B:%.*]], [[A:%.*]]
196 ; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]
197 ; CHECK-NEXT: ret float [[D]]
199 %C = fdiv float %B, %A
200 %D = select i1 %cond, float %C, float %A