xref: /llvm-project/llvm/test/Transforms/InstCombine/fabs-as-int.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
112660867SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
212660867SMatt Arsenault; RUN: opt -S -passes=instcombine %s | FileCheck %s
312660867SMatt Arsenault
412660867SMatt Arsenaultdefine float @fabs_as_int_f32_castback_noimplicitfloat(float %val) noimplicitfloat {
512660867SMatt Arsenault; CHECK-LABEL: define float @fabs_as_int_f32_castback_noimplicitfloat
612660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) #[[ATTR0:[0-9]+]] {
712660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
812660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
912660867SMatt Arsenault; CHECK-NEXT:    [[FABS:%.*]] = bitcast i32 [[AND]] to float
1012660867SMatt Arsenault; CHECK-NEXT:    ret float [[FABS]]
1112660867SMatt Arsenault;
1212660867SMatt Arsenault  %bitcast = bitcast float %val to i32
1312660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
1412660867SMatt Arsenault  %fabs = bitcast i32 %and to float
1512660867SMatt Arsenault  ret float %fabs
1612660867SMatt Arsenault}
1712660867SMatt Arsenault
1812660867SMatt Arsenaultdefine <2 x i32> @fabs_as_int_v2f32_noimplicitfloat(<2 x float> %x) noimplicitfloat {
1912660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fabs_as_int_v2f32_noimplicitfloat
2012660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) #[[ATTR0]] {
2112660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
22*38fffa63SPaul Walker; CHECK-NEXT:    [[AND:%.*]] = and <2 x i32> [[BC]], splat (i32 2147483647)
2312660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[AND]]
2412660867SMatt Arsenault;
2512660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
2612660867SMatt Arsenault  %and = and <2 x i32> %bc, <i32 2147483647, i32 2147483647>
2712660867SMatt Arsenault  ret <2 x i32> %and
2812660867SMatt Arsenault}
2912660867SMatt Arsenault
3012660867SMatt Arsenaultdefine float @fabs_as_int_f32_castback(float %val) {
3112660867SMatt Arsenault; CHECK-LABEL: define float @fabs_as_int_f32_castback
3212660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
335c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
345c0da583SMatt Arsenault; CHECK-NEXT:    ret float [[TMP1]]
3512660867SMatt Arsenault;
3612660867SMatt Arsenault  %bitcast = bitcast float %val to i32
3712660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
3812660867SMatt Arsenault  %fabs = bitcast i32 %and to float
3912660867SMatt Arsenault  ret float %fabs
4012660867SMatt Arsenault}
4112660867SMatt Arsenault
4212660867SMatt Arsenaultdefine float @not_fabs_as_int_f32_castback_wrongconst(float %val) {
4312660867SMatt Arsenault; CHECK-LABEL: define float @not_fabs_as_int_f32_castback_wrongconst
4412660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
455c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
465c0da583SMatt Arsenault; CHECK-NEXT:    ret float [[TMP1]]
4712660867SMatt Arsenault;
4812660867SMatt Arsenault  %bitcast = bitcast float %val to i32
4912660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
5012660867SMatt Arsenault  %fabs = bitcast i32 %and to float
5112660867SMatt Arsenault  ret float %fabs
5212660867SMatt Arsenault}
5312660867SMatt Arsenault
5412660867SMatt Arsenaultdefine float @fabs_as_int_f32_castback_multi_use(float %val, ptr %ptr) {
5512660867SMatt Arsenault; CHECK-LABEL: define float @fabs_as_int_f32_castback_multi_use
5612660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]], ptr [[PTR:%.*]]) {
575c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
585c0da583SMatt Arsenault; CHECK-NEXT:    store float [[TMP1]], ptr [[PTR]], align 4
595c0da583SMatt Arsenault; CHECK-NEXT:    ret float [[TMP1]]
6012660867SMatt Arsenault;
6112660867SMatt Arsenault  %bitcast = bitcast float %val to i32
6212660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
6312660867SMatt Arsenault  store i32 %and, ptr %ptr
6412660867SMatt Arsenault  %fabs = bitcast i32 %and to float
6512660867SMatt Arsenault  ret float %fabs
6612660867SMatt Arsenault}
6712660867SMatt Arsenault
6812660867SMatt Arsenaultdefine i64 @fabs_as_int_f64(double %x) {
6912660867SMatt Arsenault; CHECK-LABEL: define i64 @fabs_as_int_f64
7012660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
715c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
725c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast double [[TMP1]] to i64
7312660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[AND]]
7412660867SMatt Arsenault;
7512660867SMatt Arsenault  %bc = bitcast double %x to i64
7612660867SMatt Arsenault  %and = and i64 %bc, 9223372036854775807
7712660867SMatt Arsenault  ret i64 %and
7812660867SMatt Arsenault}
7912660867SMatt Arsenault
8012660867SMatt Arsenaultdefine <2 x i64> @fabs_as_int_v2f64(<2 x double> %x) {
8112660867SMatt Arsenault; CHECK-LABEL: define <2 x i64> @fabs_as_int_v2f64
8212660867SMatt Arsenault; CHECK-SAME: (<2 x double> [[X:%.*]]) {
835c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> [[X]])
845c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast <2 x double> [[TMP1]] to <2 x i64>
8512660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i64> [[AND]]
8612660867SMatt Arsenault;
8712660867SMatt Arsenault  %bc = bitcast <2 x double> %x to <2 x i64>
8812660867SMatt Arsenault  %and = and <2 x i64> %bc, <i64 9223372036854775807, i64 9223372036854775807>
8912660867SMatt Arsenault  ret <2 x i64> %and
9012660867SMatt Arsenault}
9112660867SMatt Arsenault
9212660867SMatt Arsenaultdefine i64 @fabs_as_int_f64_swap(double %x) {
9312660867SMatt Arsenault; CHECK-LABEL: define i64 @fabs_as_int_f64_swap
9412660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
955c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
965c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast double [[TMP1]] to i64
9712660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[AND]]
9812660867SMatt Arsenault;
9912660867SMatt Arsenault  %bc = bitcast double %x to i64
10012660867SMatt Arsenault  %and = and i64 9223372036854775807, %bc
10112660867SMatt Arsenault  ret i64 %and
10212660867SMatt Arsenault}
10312660867SMatt Arsenault
10412660867SMatt Arsenaultdefine i32 @fabs_as_int_f32(float %x) {
10512660867SMatt Arsenault; CHECK-LABEL: define i32 @fabs_as_int_f32
10612660867SMatt Arsenault; CHECK-SAME: (float [[X:%.*]]) {
1075c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
1085c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast float [[TMP1]] to i32
10912660867SMatt Arsenault; CHECK-NEXT:    ret i32 [[AND]]
11012660867SMatt Arsenault;
11112660867SMatt Arsenault  %bc = bitcast float %x to i32
11212660867SMatt Arsenault  %and = and i32 %bc, 2147483647
11312660867SMatt Arsenault  ret i32 %and
11412660867SMatt Arsenault}
11512660867SMatt Arsenault
11612660867SMatt Arsenaultdefine <2 x i32> @fabs_as_int_v2f32(<2 x float> %x) {
11712660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fabs_as_int_v2f32
11812660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
1195c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]])
1205c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast <2 x float> [[TMP1]] to <2 x i32>
12112660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[AND]]
12212660867SMatt Arsenault;
12312660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
12412660867SMatt Arsenault  %and = and <2 x i32> %bc, <i32 2147483647, i32 2147483647>
12512660867SMatt Arsenault  ret <2 x i32> %and
12612660867SMatt Arsenault}
12712660867SMatt Arsenault
12812660867SMatt Arsenaultdefine <2 x i32> @not_fabs_as_int_v2f32_nonsplat(<2 x float> %x) {
12912660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @not_fabs_as_int_v2f32_nonsplat
13012660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
13112660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
13212660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and <2 x i32> [[BC]], <i32 2147483647, i32 2147483646>
13312660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[AND]]
13412660867SMatt Arsenault;
13512660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
13612660867SMatt Arsenault  %and = and <2 x i32> %bc, <i32 2147483647, i32 2147483646>
13712660867SMatt Arsenault  ret <2 x i32> %and
13812660867SMatt Arsenault}
13912660867SMatt Arsenault
140d9a5aa8eSNikita Popovdefine <3 x i32> @fabs_as_int_v3f32_poison(<3 x float> %x) {
141d9a5aa8eSNikita Popov; CHECK-LABEL: define <3 x i32> @fabs_as_int_v3f32_poison
14212660867SMatt Arsenault; CHECK-SAME: (<3 x float> [[X:%.*]]) {
1435c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <3 x float> @llvm.fabs.v3f32(<3 x float> [[X]])
1445c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast <3 x float> [[TMP1]] to <3 x i32>
14512660867SMatt Arsenault; CHECK-NEXT:    ret <3 x i32> [[AND]]
14612660867SMatt Arsenault;
14712660867SMatt Arsenault  %bc = bitcast <3 x float> %x to <3 x i32>
148d9a5aa8eSNikita Popov  %and = and <3 x i32> %bc, <i32 2147483647, i32 poison, i32 2147483647>
14912660867SMatt Arsenault  ret <3 x i32> %and
15012660867SMatt Arsenault}
15112660867SMatt Arsenault
15212660867SMatt Arsenault; Make sure that only a bitcast is transformed.
15312660867SMatt Arsenaultdefine i64 @fabs_as_int_f64_not_bitcast(double %x) {
15412660867SMatt Arsenault; CHECK-LABEL: define i64 @fabs_as_int_f64_not_bitcast
15512660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
15612660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = fptoui double [[X]] to i64
15712660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i64 [[BC]], 9223372036854775807
15812660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[AND]]
15912660867SMatt Arsenault;
16012660867SMatt Arsenault  %bc = fptoui double %x to i64
16112660867SMatt Arsenault  %and = and i64 %bc, 9223372036854775807
16212660867SMatt Arsenault  ret i64 %and
16312660867SMatt Arsenault}
16412660867SMatt Arsenault
16512660867SMatt Arsenaultdefine float @not_fabs_as_int_f32_bitcast_from_v2f16(<2 x half> %val) {
16612660867SMatt Arsenault; CHECK-LABEL: define float @not_fabs_as_int_f32_bitcast_from_v2f16
16712660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[VAL:%.*]]) {
16812660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x half> [[VAL]] to i32
16912660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
17012660867SMatt Arsenault; CHECK-NEXT:    [[FABS:%.*]] = bitcast i32 [[AND]] to float
17112660867SMatt Arsenault; CHECK-NEXT:    ret float [[FABS]]
17212660867SMatt Arsenault;
17312660867SMatt Arsenault  %bitcast = bitcast <2 x half> %val to i32
17412660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
17512660867SMatt Arsenault  %fabs = bitcast i32 %and to float
17612660867SMatt Arsenault  ret float %fabs
17712660867SMatt Arsenault}
17812660867SMatt Arsenault
17912660867SMatt Arsenaultdefine float @not_fabs_as_int_f32_bitcast_from_v2i16(<2 x i16> %val) {
18012660867SMatt Arsenault; CHECK-LABEL: define float @not_fabs_as_int_f32_bitcast_from_v2i16
18112660867SMatt Arsenault; CHECK-SAME: (<2 x i16> [[VAL:%.*]]) {
18212660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x i16> [[VAL]] to i32
18312660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i32 [[BITCAST]], 2147483647
18412660867SMatt Arsenault; CHECK-NEXT:    [[FABS:%.*]] = bitcast i32 [[AND]] to float
18512660867SMatt Arsenault; CHECK-NEXT:    ret float [[FABS]]
18612660867SMatt Arsenault;
18712660867SMatt Arsenault  %bitcast = bitcast <2 x i16> %val to i32
18812660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
18912660867SMatt Arsenault  %fabs = bitcast i32 %and to float
19012660867SMatt Arsenault  ret float %fabs
19112660867SMatt Arsenault}
19212660867SMatt Arsenault
19312660867SMatt Arsenaultdefine i128 @fabs_as_int_fp128_f64_mask(fp128 %x) {
19412660867SMatt Arsenault; CHECK-LABEL: define i128 @fabs_as_int_fp128_f64_mask
19512660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
1965c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X]])
1975c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast fp128 [[TMP1]] to i128
19812660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[AND]]
19912660867SMatt Arsenault;
20012660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
20112660867SMatt Arsenault  %and = and i128 %bc, 170141183460469231731687303715884105727
20212660867SMatt Arsenault  ret i128 %and
20312660867SMatt Arsenault}
20412660867SMatt Arsenault
20512660867SMatt Arsenaultdefine i128 @fabs_as_int_fp128_f128_mask(fp128 %x) {
20612660867SMatt Arsenault; CHECK-LABEL: define i128 @fabs_as_int_fp128_f128_mask
20712660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
2085c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X]])
2095c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast fp128 [[TMP1]] to i128
21012660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[AND]]
21112660867SMatt Arsenault;
21212660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
21312660867SMatt Arsenault  %and = and i128 %bc, 170141183460469231731687303715884105727
21412660867SMatt Arsenault  ret i128 %and
21512660867SMatt Arsenault}
21612660867SMatt Arsenault
21712660867SMatt Arsenaultdefine i16 @fabs_as_int_f16(half %x) {
21812660867SMatt Arsenault; CHECK-LABEL: define i16 @fabs_as_int_f16
21912660867SMatt Arsenault; CHECK-SAME: (half [[X:%.*]]) {
2205c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[X]])
2215c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast half [[TMP1]] to i16
22212660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[AND]]
22312660867SMatt Arsenault;
22412660867SMatt Arsenault  %bc = bitcast half %x to i16
22512660867SMatt Arsenault  %and = and i16 %bc, 32767
22612660867SMatt Arsenault  ret i16 %and
22712660867SMatt Arsenault}
22812660867SMatt Arsenault
22912660867SMatt Arsenaultdefine <2 x i16> @fabs_as_int_v2f16(<2 x half> %x) {
23012660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fabs_as_int_v2f16
23112660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[X:%.*]]) {
2325c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X]])
2335c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast <2 x half> [[TMP1]] to <2 x i16>
23412660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[AND]]
23512660867SMatt Arsenault;
23612660867SMatt Arsenault  %bc = bitcast <2 x half> %x to <2 x i16>
23712660867SMatt Arsenault  %and = and <2 x i16> %bc, <i16 32767, i16 32767>
23812660867SMatt Arsenault  ret <2 x i16> %and
23912660867SMatt Arsenault}
24012660867SMatt Arsenault
24112660867SMatt Arsenaultdefine i16 @fabs_as_int_bf16(bfloat %x) {
24212660867SMatt Arsenault; CHECK-LABEL: define i16 @fabs_as_int_bf16
24312660867SMatt Arsenault; CHECK-SAME: (bfloat [[X:%.*]]) {
2445c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call bfloat @llvm.fabs.bf16(bfloat [[X]])
2455c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast bfloat [[TMP1]] to i16
24612660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[AND]]
24712660867SMatt Arsenault;
24812660867SMatt Arsenault  %bc = bitcast bfloat %x to i16
24912660867SMatt Arsenault  %and = and i16 %bc, 32767
25012660867SMatt Arsenault  ret i16 %and
25112660867SMatt Arsenault}
25212660867SMatt Arsenault
25312660867SMatt Arsenaultdefine <2 x i16> @fabs_as_int_v2bf16(<2 x bfloat> %x) {
25412660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fabs_as_int_v2bf16
25512660867SMatt Arsenault; CHECK-SAME: (<2 x bfloat> [[X:%.*]]) {
2565c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat> [[X]])
2575c0da583SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = bitcast <2 x bfloat> [[TMP1]] to <2 x i16>
25812660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[AND]]
25912660867SMatt Arsenault;
26012660867SMatt Arsenault  %bc = bitcast <2 x bfloat> %x to <2 x i16>
26112660867SMatt Arsenault  %and = and <2 x i16> %bc, <i16 32767, i16 32767>
26212660867SMatt Arsenault  ret <2 x i16> %and
26312660867SMatt Arsenault}
26412660867SMatt Arsenault
26512660867SMatt Arsenaultdefine i80 @fabs_as_int_x86_fp80_f64_mask(x86_fp80 %x) {
26612660867SMatt Arsenault; CHECK-LABEL: define i80 @fabs_as_int_x86_fp80_f64_mask
26712660867SMatt Arsenault; CHECK-SAME: (x86_fp80 [[X:%.*]]) {
26812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast x86_fp80 [[X]] to i80
26912660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i80 [[BC]], 9223372036854775807
27012660867SMatt Arsenault; CHECK-NEXT:    ret i80 [[AND]]
27112660867SMatt Arsenault;
27212660867SMatt Arsenault  %bc = bitcast x86_fp80 %x to i80
27312660867SMatt Arsenault  %and = and i80 %bc, 9223372036854775807
27412660867SMatt Arsenault  ret i80 %and
27512660867SMatt Arsenault}
27612660867SMatt Arsenault
27712660867SMatt Arsenaultdefine i128 @fabs_as_int_ppc_fp128_f64_mask(ppc_fp128 %x) {
27812660867SMatt Arsenault; CHECK-LABEL: define i128 @fabs_as_int_ppc_fp128_f64_mask
27912660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
28012660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
28112660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i128 [[BC]], 9223372036854775807
28212660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[AND]]
28312660867SMatt Arsenault;
28412660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
28512660867SMatt Arsenault  %and = and i128 %bc, 9223372036854775807
28612660867SMatt Arsenault  ret i128 %and
28712660867SMatt Arsenault}
28812660867SMatt Arsenault
28912660867SMatt Arsenaultdefine i128 @fabs_as_int_ppc_fp128_f128_mask(ppc_fp128 %x) {
29012660867SMatt Arsenault; CHECK-LABEL: define i128 @fabs_as_int_ppc_fp128_f128_mask
29112660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
29212660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
29312660867SMatt Arsenault; CHECK-NEXT:    [[AND:%.*]] = and i128 [[BC]], 170141183460469231731687303715884105727
29412660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[AND]]
29512660867SMatt Arsenault;
29612660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
29712660867SMatt Arsenault  %and = and i128 %bc, 170141183460469231731687303715884105727
29812660867SMatt Arsenault  ret i128 %and
29912660867SMatt Arsenault}
300