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>

`