InstCombine: Recognize fabs as bitcasted integer · llvm/llvm-project@5c0da58 (original) (raw)
`@@ -30,10 +30,8 @@ define <2 x i32> @fabs_as_int_v2f32_noimplicitfloat(<2 x float> %x) noimplicitfl
`
30
30
`define float @fabs_as_int_f32_castback(float %val) {
`
31
31
`; CHECK-LABEL: define float @fabs_as_int_f32_castback
`
32
32
`; CHECK-SAME: (float [[VAL:%.*]]) {
`
33
``
`-
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
`
34
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
`
35
``
`-
; CHECK-NEXT: [[FABS:%.*]] = bitcast i32 [[AND]] to float
`
36
``
`-
; CHECK-NEXT: ret float [[FABS]]
`
``
33
`+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
`
``
34
`+
; CHECK-NEXT: ret float [[TMP1]]
`
37
35
`;
`
38
36
`%bitcast = bitcast float %val to i32
`
39
37
`%and = and i32 %bitcast, 2147483647
`
`@@ -44,10 +42,8 @@ define float @fabs_as_int_f32_castback(float %val) {
`
44
42
`define float @not_fabs_as_int_f32_castback_wrongconst(float %val) {
`
45
43
`; CHECK-LABEL: define float @not_fabs_as_int_f32_castback_wrongconst
`
46
44
`; CHECK-SAME: (float [[VAL:%.*]]) {
`
47
``
`-
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
`
48
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
`
49
``
`-
; CHECK-NEXT: [[FABS:%.*]] = bitcast i32 [[AND]] to float
`
50
``
`-
; CHECK-NEXT: ret float [[FABS]]
`
``
45
`+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
`
``
46
`+
; CHECK-NEXT: ret float [[TMP1]]
`
51
47
`;
`
52
48
`%bitcast = bitcast float %val to i32
`
53
49
`%and = and i32 %bitcast, 2147483647
`
`@@ -58,11 +54,9 @@ define float @not_fabs_as_int_f32_castback_wrongconst(float %val) {
`
58
54
`define float @fabs_as_int_f32_castback_multi_use(float %val, ptr %ptr) {
`
59
55
`; CHECK-LABEL: define float @fabs_as_int_f32_castback_multi_use
`
60
56
`; CHECK-SAME: (float [[VAL:%.]], ptr [[PTR:%.]]) {
`
61
``
`-
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
`
62
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
`
63
``
`-
; CHECK-NEXT: store i32 [[AND]], ptr [[PTR]], align 4
`
64
``
`-
; CHECK-NEXT: [[FABS:%.*]] = bitcast i32 [[AND]] to float
`
65
``
`-
; CHECK-NEXT: ret float [[FABS]]
`
``
57
`+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
`
``
58
`+
; CHECK-NEXT: store float [[TMP1]], ptr [[PTR]], align 4
`
``
59
`+
; CHECK-NEXT: ret float [[TMP1]]
`
66
60
`;
`
67
61
`%bitcast = bitcast float %val to i32
`
68
62
`%and = and i32 %bitcast, 2147483647
`
`@@ -74,8 +68,8 @@ define float @fabs_as_int_f32_castback_multi_use(float %val, ptr %ptr) {
`
74
68
`define i64 @fabs_as_int_f64(double %x) {
`
75
69
`; CHECK-LABEL: define i64 @fabs_as_int_f64
`
76
70
`; CHECK-SAME: (double [[X:%.*]]) {
`
77
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast double [[X]] to i64
`
78
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i64 [[BC]], 9223372036854775807
`
``
71
`+
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
`
``
72
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast double [[TMP1]] to i64
`
79
73
`; CHECK-NEXT: ret i64 [[AND]]
`
80
74
`;
`
81
75
`%bc = bitcast double %x to i64
`
`@@ -86,8 +80,8 @@ define i64 @fabs_as_int_f64(double %x) {
`
86
80
`define <2 x i64> @fabs_as_int_v2f64(<2 x double> %x) {
`
87
81
`; CHECK-LABEL: define <2 x i64> @fabs_as_int_v2f64
`
88
82
`; CHECK-SAME: (<2 x double> [[X:%.*]]) {
`
89
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast <2 x double> [[X]] to <2 x i64>
`
90
``
`-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i64> [[BC]], <i64 9223372036854775807, i64 9223372036854775807>
`
``
83
`+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> [[X]])
`
``
84
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast <2 x double> [[TMP1]] to <2 x i64>
`
91
85
`; CHECK-NEXT: ret <2 x i64> [[AND]]
`
92
86
`;
`
93
87
`%bc = bitcast <2 x double> %x to <2 x i64>
`
`@@ -98,8 +92,8 @@ define <2 x i64> @fabs_as_int_v2f64(<2 x double> %x) {
`
98
92
`define i64 @fabs_as_int_f64_swap(double %x) {
`
99
93
`; CHECK-LABEL: define i64 @fabs_as_int_f64_swap
`
100
94
`; CHECK-SAME: (double [[X:%.*]]) {
`
101
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast double [[X]] to i64
`
102
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i64 [[BC]], 9223372036854775807
`
``
95
`+
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
`
``
96
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast double [[TMP1]] to i64
`
103
97
`; CHECK-NEXT: ret i64 [[AND]]
`
104
98
`;
`
105
99
`%bc = bitcast double %x to i64
`
`@@ -110,8 +104,8 @@ define i64 @fabs_as_int_f64_swap(double %x) {
`
110
104
`define i32 @fabs_as_int_f32(float %x) {
`
111
105
`; CHECK-LABEL: define i32 @fabs_as_int_f32
`
112
106
`; CHECK-SAME: (float [[X:%.*]]) {
`
113
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast float [[X]] to i32
`
114
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[BC]], 2147483647
`
``
107
`+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
`
``
108
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast float [[TMP1]] to i32
`
115
109
`; CHECK-NEXT: ret i32 [[AND]]
`
116
110
`;
`
117
111
`%bc = bitcast float %x to i32
`
`@@ -122,8 +116,8 @@ define i32 @fabs_as_int_f32(float %x) {
`
122
116
`define <2 x i32> @fabs_as_int_v2f32(<2 x float> %x) {
`
123
117
`; CHECK-LABEL: define <2 x i32> @fabs_as_int_v2f32
`
124
118
`; CHECK-SAME: (<2 x float> [[X:%.*]]) {
`
125
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
`
126
``
`-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[BC]], <i32 2147483647, i32 2147483647>
`
``
119
`+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]])
`
``
120
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast <2 x float> [[TMP1]] to <2 x i32>
`
127
121
`; CHECK-NEXT: ret <2 x i32> [[AND]]
`
128
122
`;
`
129
123
`%bc = bitcast <2 x float> %x to <2 x i32>
`
`@@ -146,8 +140,8 @@ define <2 x i32> @not_fabs_as_int_v2f32_nonsplat(<2 x float> %x) {
`
146
140
`define <3 x i32> @fabs_as_int_v3f32_undef(<3 x float> %x) {
`
147
141
`; CHECK-LABEL: define <3 x i32> @fabs_as_int_v3f32_undef
`
148
142
`; CHECK-SAME: (<3 x float> [[X:%.*]]) {
`
149
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast <3 x float> [[X]] to <3 x i32>
`
150
``
`-
; CHECK-NEXT: [[AND:%.*]] = and <3 x i32> [[BC]], <i32 2147483647, i32 undef, i32 2147483647>
`
``
143
`+
; CHECK-NEXT: [[TMP1:%.*]] = call <3 x float> @llvm.fabs.v3f32(<3 x float> [[X]])
`
``
144
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast <3 x float> [[TMP1]] to <3 x i32>
`
151
145
`; CHECK-NEXT: ret <3 x i32> [[AND]]
`
152
146
`;
`
153
147
`%bc = bitcast <3 x float> %x to <3 x i32>
`
`@@ -199,8 +193,8 @@ define float @not_fabs_as_int_f32_bitcast_from_v2i16(<2 x i16> %val) {
`
199
193
`define i128 @fabs_as_int_fp128_f64_mask(fp128 %x) {
`
200
194
`; CHECK-LABEL: define i128 @fabs_as_int_fp128_f64_mask
`
201
195
`; CHECK-SAME: (fp128 [[X:%.*]]) {
`
202
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast fp128 [[X]] to i128
`
203
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i128 [[BC]], 170141183460469231731687303715884105727
`
``
196
`+
; CHECK-NEXT: [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X]])
`
``
197
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast fp128 [[TMP1]] to i128
`
204
198
`; CHECK-NEXT: ret i128 [[AND]]
`
205
199
`;
`
206
200
`%bc = bitcast fp128 %x to i128
`
`@@ -211,8 +205,8 @@ define i128 @fabs_as_int_fp128_f64_mask(fp128 %x) {
`
211
205
`define i128 @fabs_as_int_fp128_f128_mask(fp128 %x) {
`
212
206
`; CHECK-LABEL: define i128 @fabs_as_int_fp128_f128_mask
`
213
207
`; CHECK-SAME: (fp128 [[X:%.*]]) {
`
214
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast fp128 [[X]] to i128
`
215
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i128 [[BC]], 170141183460469231731687303715884105727
`
``
208
`+
; CHECK-NEXT: [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X]])
`
``
209
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast fp128 [[TMP1]] to i128
`
216
210
`; CHECK-NEXT: ret i128 [[AND]]
`
217
211
`;
`
218
212
`%bc = bitcast fp128 %x to i128
`
`@@ -223,8 +217,8 @@ define i128 @fabs_as_int_fp128_f128_mask(fp128 %x) {
`
223
217
`define i16 @fabs_as_int_f16(half %x) {
`
224
218
`; CHECK-LABEL: define i16 @fabs_as_int_f16
`
225
219
`; CHECK-SAME: (half [[X:%.*]]) {
`
226
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast half [[X]] to i16
`
227
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i16 [[BC]], 32767
`
``
220
`+
; CHECK-NEXT: [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[X]])
`
``
221
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast half [[TMP1]] to i16
`
228
222
`; CHECK-NEXT: ret i16 [[AND]]
`
229
223
`;
`
230
224
`%bc = bitcast half %x to i16
`
`@@ -235,8 +229,8 @@ define i16 @fabs_as_int_f16(half %x) {
`
235
229
`define <2 x i16> @fabs_as_int_v2f16(<2 x half> %x) {
`
236
230
`; CHECK-LABEL: define <2 x i16> @fabs_as_int_v2f16
`
237
231
`; CHECK-SAME: (<2 x half> [[X:%.*]]) {
`
238
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast <2 x half> [[X]] to <2 x i16>
`
239
``
`-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i16> [[BC]], <i16 32767, i16 32767>
`
``
232
`+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X]])
`
``
233
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast <2 x half> [[TMP1]] to <2 x i16>
`
240
234
`; CHECK-NEXT: ret <2 x i16> [[AND]]
`
241
235
`;
`
242
236
`%bc = bitcast <2 x half> %x to <2 x i16>
`
`@@ -247,8 +241,8 @@ define <2 x i16> @fabs_as_int_v2f16(<2 x half> %x) {
`
247
241
`define i16 @fabs_as_int_bf16(bfloat %x) {
`
248
242
`; CHECK-LABEL: define i16 @fabs_as_int_bf16
`
249
243
`; CHECK-SAME: (bfloat [[X:%.*]]) {
`
250
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast bfloat [[X]] to i16
`
251
``
`-
; CHECK-NEXT: [[AND:%.*]] = and i16 [[BC]], 32767
`
``
244
`+
; CHECK-NEXT: [[TMP1:%.*]] = call bfloat @llvm.fabs.bf16(bfloat [[X]])
`
``
245
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast bfloat [[TMP1]] to i16
`
252
246
`; CHECK-NEXT: ret i16 [[AND]]
`
253
247
`;
`
254
248
`%bc = bitcast bfloat %x to i16
`
`@@ -259,8 +253,8 @@ define i16 @fabs_as_int_bf16(bfloat %x) {
`
259
253
`define <2 x i16> @fabs_as_int_v2bf16(<2 x bfloat> %x) {
`
260
254
`; CHECK-LABEL: define <2 x i16> @fabs_as_int_v2bf16
`
261
255
`; CHECK-SAME: (<2 x bfloat> [[X:%.*]]) {
`
262
``
`-
; CHECK-NEXT: [[BC:%.*]] = bitcast <2 x bfloat> [[X]] to <2 x i16>
`
263
``
`-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i16> [[BC]], <i16 32767, i16 32767>
`
``
256
`+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat> [[X]])
`
``
257
`+
; CHECK-NEXT: [[AND:%.*]] = bitcast <2 x bfloat> [[TMP1]] to <2 x i16>
`
264
258
`; CHECK-NEXT: ret <2 x i16> [[AND]]
`
265
259
`;
`
266
260
`%bc = bitcast <2 x bfloat> %x to <2 x i16>
`