[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstCombine / select-binop-foldable-floating-point.ll
blob0dfd116d56219dde000467a8bdeacd05a6f04edd
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
12   ret float %D
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
23   ret float %D
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
34   ret float %D
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
45   ret float %D
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
56   ret float %D
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
67   ret float %D
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
78   ret float %D
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
89   ret float %D
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
100   ret float %D
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
111   ret float %D
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
122   ret float %D
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
133   ret float %D
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
145   ret float %D
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
156   ret float %D
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
167   ret float %D
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
178   ret float %D
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
189   ret float %D
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
201   ret float %D