blob: 7e75ae1f630f2d73124dd1d012042756bff5afc2 [file] [log] [blame]
Sanjay Patel43f71ea2018-03-15 14:48:39 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
Sanjay Patel5a5c33d2018-03-16 20:55:55 +00004; Default NaN constant
5
6define double @fadd_nan_op0(double %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +00007; CHECK-LABEL: @fadd_nan_op0(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +00008; CHECK-NEXT: [[R:%.*]] = fadd double 0x7FF8000000000000, [[X:%.*]]
9; CHECK-NEXT: ret double [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000010;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000011 %r = fadd double 0x7FF8000000000000, %x
12 ret double %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000013}
14
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000015; Sign bit is set
16
17define double @fadd_nan_op1(double %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000018; CHECK-LABEL: @fadd_nan_op1(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000019; CHECK-NEXT: [[R:%.*]] = fadd double [[X:%.*]], 0xFFF8000000000000
20; CHECK-NEXT: ret double [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000021;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000022 %r = fadd double %x, 0xFFF8000000000000
23 ret double %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000024}
25
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000026; Non-zero payload
27
Sanjay Patel43f71ea2018-03-15 14:48:39 +000028define float @fsub_nan_op0(float %x) {
29; CHECK-LABEL: @fsub_nan_op0(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000030; CHECK-NEXT: [[R:%.*]] = fsub float 0x7FFFFF0000000000, [[X:%.*]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000031; CHECK-NEXT: ret float [[R]]
32;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000033 %r = fsub float 0x7FFFFF0000000000, %x
Sanjay Patel43f71ea2018-03-15 14:48:39 +000034 ret float %r
35}
36
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000037; Signaling
38
Sanjay Patel43f71ea2018-03-15 14:48:39 +000039define float @fsub_nan_op1(float %x) {
40; CHECK-LABEL: @fsub_nan_op1(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000041; CHECK-NEXT: [[R:%.*]] = fsub float [[X:%.*]], 0x7FF1000000000000
Sanjay Patel43f71ea2018-03-15 14:48:39 +000042; CHECK-NEXT: ret float [[R]]
43;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000044 %r = fsub float %x, 0x7FF1000000000000
Sanjay Patel43f71ea2018-03-15 14:48:39 +000045 ret float %r
46}
47
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000048; Signaling and signed
49
50define double @fmul_nan_op0(double %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000051; CHECK-LABEL: @fmul_nan_op0(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000052; CHECK-NEXT: [[R:%.*]] = fmul double 0xFFF0000000000001, [[X:%.*]]
53; CHECK-NEXT: ret double [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000054;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000055 %r = fmul double 0xFFF0000000000001, %x
56 ret double %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000057}
58
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000059; Vector type
60
61define <2 x float> @fmul_nan_op1(<2 x float> %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000062; CHECK-LABEL: @fmul_nan_op1(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000063; CHECK-NEXT: [[R:%.*]] = fmul <2 x float> [[X:%.*]], <float 0x7FF8000000000000, float 0x7FF8000000000000>
64; CHECK-NEXT: ret <2 x float> [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000065;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000066 %r = fmul <2 x float> %x, <float 0x7FF8000000000000, float 0x7FF8000000000000>
67 ret <2 x float> %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000068}
69
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000070; Vector signed and non-zero payload
71
72define <2 x double> @fdiv_nan_op0(<2 x double> %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000073; CHECK-LABEL: @fdiv_nan_op0(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000074; CHECK-NEXT: [[R:%.*]] = fdiv <2 x double> <double 0xFFF800000000000F, double 0xFFF800000000000F>, [[X:%.*]]
75; CHECK-NEXT: ret <2 x double> [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000076;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000077 %r = fdiv <2 x double> <double 0xFFF800000000000F, double 0xFFF800000000000F>, %x
78 ret <2 x double> %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000079}
80
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000081; Vector with different NaN constant elements
82
83define <2 x half> @fdiv_nan_op1(<2 x half> %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000084; CHECK-LABEL: @fdiv_nan_op1(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000085; CHECK-NEXT: [[R:%.*]] = fdiv <2 x half> [[X:%.*]], <half 0xH7FFF, half 0xHFF00>
86; CHECK-NEXT: ret <2 x half> [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000087;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000088 %r = fdiv <2 x half> %x, <half 0xH7FFF, half 0xHFF00>
89 ret <2 x half> %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +000090}
91
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000092; Vector with undef element
93
94define <2 x double> @frem_nan_op0(<2 x double> %x) {
Sanjay Patel43f71ea2018-03-15 14:48:39 +000095; CHECK-LABEL: @frem_nan_op0(
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000096; CHECK-NEXT: [[R:%.*]] = frem <2 x double> <double 0xFFFF000000000000, double undef>, [[X:%.*]]
97; CHECK-NEXT: ret <2 x double> [[R]]
Sanjay Patel43f71ea2018-03-15 14:48:39 +000098;
Sanjay Patel5a5c33d2018-03-16 20:55:55 +000099 %r = frem <2 x double> <double 0xFFFF000000000000, double undef>, %x
100 ret <2 x double> %r
Sanjay Patel43f71ea2018-03-15 14:48:39 +0000101}
102
103define float @frem_nan_op1(float %x) {
104; CHECK-LABEL: @frem_nan_op1(
105; CHECK-NEXT: [[R:%.*]] = frem float [[X:%.*]], 0x7FF8000000000000
106; CHECK-NEXT: ret float [[R]]
107;
108 %r = frem float %x, 0x7FF8000000000000
109 ret float %r
110}
111
Sanjay Patel5a5c33d2018-03-16 20:55:55 +0000112; Special-case: fneg must only change the sign bit (this is handled by constant folding).
113
114define double @fneg_nan_1(double %x) {
115; CHECK-LABEL: @fneg_nan_1(
116; CHECK-NEXT: ret double 0xFFFABCDEF0123456
117;
118 %r = fsub double -0.0, 0x7FFABCDEF0123456
119 ret double %r
120}
121
122define <2 x double> @fneg_nan_2(<2 x double> %x) {
123; CHECK-LABEL: @fneg_nan_2(
124; CHECK-NEXT: ret <2 x double> <double 0x7FF1234567890ABC, double 0xFFF0000000000001>
125;
126 %r = fsub <2 x double> <double -0.0, double -0.0>, <double 0xFFF1234567890ABC, double 0x7FF0000000000001>
127 ret <2 x double> %r
128}
129
Sanjay Patel43f71ea2018-03-15 14:48:39 +0000130; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage.
131
132define float @fadd_nan_op0_nnan(float %x) {
133; CHECK-LABEL: @fadd_nan_op0_nnan(
134; CHECK-NEXT: [[R:%.*]] = fadd nnan float 0x7FF8000000000000, [[X:%.*]]
135; CHECK-NEXT: ret float [[R]]
136;
137 %r = fadd nnan float 0x7FF8000000000000, %x
138 ret float %r
139}
140
141define float @fadd_nan_op1_fast(float %x) {
142; CHECK-LABEL: @fadd_nan_op1_fast(
143; CHECK-NEXT: [[R:%.*]] = fadd fast float [[X:%.*]], 0x7FF8000000000000
144; CHECK-NEXT: ret float [[R]]
145;
146 %r = fadd fast float %x, 0x7FF8000000000000
147 ret float %r
148}
149
150define float @fsub_nan_op0_fast(float %x) {
151; CHECK-LABEL: @fsub_nan_op0_fast(
152; CHECK-NEXT: [[R:%.*]] = fsub fast float 0x7FF8000000000000, [[X:%.*]]
153; CHECK-NEXT: ret float [[R]]
154;
155 %r = fsub fast float 0x7FF8000000000000, %x
156 ret float %r
157}
158
159define float @fsub_nan_op1_nnan(float %x) {
160; CHECK-LABEL: @fsub_nan_op1_nnan(
161; CHECK-NEXT: [[R:%.*]] = fsub nnan float [[X:%.*]], 0x7FF8000000000000
162; CHECK-NEXT: ret float [[R]]
163;
164 %r = fsub nnan float %x, 0x7FF8000000000000
165 ret float %r
166}
167
168define float @fmul_nan_op0_nnan(float %x) {
169; CHECK-LABEL: @fmul_nan_op0_nnan(
170; CHECK-NEXT: [[R:%.*]] = fmul nnan float 0x7FF8000000000000, [[X:%.*]]
171; CHECK-NEXT: ret float [[R]]
172;
173 %r = fmul nnan float 0x7FF8000000000000, %x
174 ret float %r
175}
176
177define float @fmul_nan_op1_fast(float %x) {
178; CHECK-LABEL: @fmul_nan_op1_fast(
179; CHECK-NEXT: [[R:%.*]] = fmul fast float [[X:%.*]], 0x7FF8000000000000
180; CHECK-NEXT: ret float [[R]]
181;
182 %r = fmul fast float %x, 0x7FF8000000000000
183 ret float %r
184}
185
186define float @fdiv_nan_op0_fast(float %x) {
187; CHECK-LABEL: @fdiv_nan_op0_fast(
188; CHECK-NEXT: [[R:%.*]] = fdiv fast float 0x7FF8000000000000, [[X:%.*]]
189; CHECK-NEXT: ret float [[R]]
190;
191 %r = fdiv fast float 0x7FF8000000000000, %x
192 ret float %r
193}
194
195define float @fdiv_nan_op1_nnan(float %x) {
196; CHECK-LABEL: @fdiv_nan_op1_nnan(
197; CHECK-NEXT: [[R:%.*]] = fdiv nnan float [[X:%.*]], 0x7FF8000000000000
198; CHECK-NEXT: ret float [[R]]
199;
200 %r = fdiv nnan float %x, 0x7FF8000000000000
201 ret float %r
202}
203
204define float @frem_nan_op0_nnan(float %x) {
205; CHECK-LABEL: @frem_nan_op0_nnan(
206; CHECK-NEXT: [[R:%.*]] = frem nnan float 0x7FF8000000000000, [[X:%.*]]
207; CHECK-NEXT: ret float [[R]]
208;
209 %r = frem nnan float 0x7FF8000000000000, %x
210 ret float %r
211}
212
213define float @frem_nan_op1_fast(float %x) {
214; CHECK-LABEL: @frem_nan_op1_fast(
215; CHECK-NEXT: [[R:%.*]] = frem fast float [[X:%.*]], 0x7FF8000000000000
216; CHECK-NEXT: ret float [[R]]
217;
218 %r = frem fast float %x, 0x7FF8000000000000
219 ret float %r
220}
221