xref: /llvm-project/llvm/test/Transforms/InstCombine/fneg-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 @fneg_as_int_f32_castback_noimplicitfloat(float %val) noimplicitfloat {
512660867SMatt Arsenault; CHECK-LABEL: define float @fneg_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:    [[XOR:%.*]] = xor i32 [[BITCAST]], -2147483648
912660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[XOR]] to float
1012660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
1112660867SMatt Arsenault;
1212660867SMatt Arsenault  %bitcast = bitcast float %val to i32
1312660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483648
1412660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
1512660867SMatt Arsenault  ret float %fneg
1612660867SMatt Arsenault}
1712660867SMatt Arsenault
1812660867SMatt Arsenaultdefine <2 x i32> @fneg_as_int_v2f32_noimplicitfloat(<2 x float> %x) noimplicitfloat {
1912660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fneg_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:    [[XOR:%.*]] = xor <2 x i32> [[BC]], splat (i32 -2147483648)
2312660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[XOR]]
2412660867SMatt Arsenault;
2512660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
2612660867SMatt Arsenault  %xor = xor <2 x i32> %bc, <i32 -2147483648, i32 -2147483648>
2712660867SMatt Arsenault  ret <2 x i32> %xor
2812660867SMatt Arsenault}
2912660867SMatt Arsenault
3012660867SMatt Arsenaultdefine float @fneg_as_int_f32_castback(float %val) {
3112660867SMatt Arsenault; CHECK-LABEL: define float @fneg_as_int_f32_castback
3212660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
3350a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg float [[VAL]]
3450a9b3d8SMatt Arsenault; CHECK-NEXT:    ret float [[TMP1]]
3512660867SMatt Arsenault;
3612660867SMatt Arsenault  %bitcast = bitcast float %val to i32
3712660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483648
3812660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
3912660867SMatt Arsenault  ret float %fneg
4012660867SMatt Arsenault}
4112660867SMatt Arsenault
4212660867SMatt Arsenaultdefine float @not_fneg_as_int_f32_castback_wrongconst(float %val) {
4312660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_as_int_f32_castback_wrongconst
4412660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
4512660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
4612660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[BITCAST]], -2147483647
4712660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[XOR]] to float
4812660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
4912660867SMatt Arsenault;
5012660867SMatt Arsenault  %bitcast = bitcast float %val to i32
5112660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483647
5212660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
5312660867SMatt Arsenault  ret float %fneg
5412660867SMatt Arsenault}
5512660867SMatt Arsenault
5612660867SMatt Arsenaultdefine float @fneg_as_int_f32_castback_multi_use(float %val, ptr %ptr) {
5712660867SMatt Arsenault; CHECK-LABEL: define float @fneg_as_int_f32_castback_multi_use
5812660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]], ptr [[PTR:%.*]]) {
5950a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg float [[VAL]]
6050a9b3d8SMatt Arsenault; CHECK-NEXT:    store float [[TMP1]], ptr [[PTR]], align 4
6150a9b3d8SMatt Arsenault; CHECK-NEXT:    ret float [[TMP1]]
6212660867SMatt Arsenault;
6312660867SMatt Arsenault  %bitcast = bitcast float %val to i32
6412660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483648
6512660867SMatt Arsenault  store i32 %xor, ptr %ptr
6612660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
6712660867SMatt Arsenault  ret float %fneg
6812660867SMatt Arsenault}
6912660867SMatt Arsenault
7012660867SMatt Arsenaultdefine i64 @fneg_as_int_f64(double %x) {
7112660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_as_int_f64
7212660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
7350a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg double [[X]]
7450a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast double [[TMP1]] to i64
7512660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[XOR]]
7612660867SMatt Arsenault;
7712660867SMatt Arsenault  %bc = bitcast double %x to i64
7812660867SMatt Arsenault  %xor = xor i64 %bc, -9223372036854775808
7912660867SMatt Arsenault  ret i64 %xor
8012660867SMatt Arsenault}
8112660867SMatt Arsenault
8212660867SMatt Arsenaultdefine <2 x i64> @fneg_as_int_v2f64(<2 x double> %x) {
8312660867SMatt Arsenault; CHECK-LABEL: define <2 x i64> @fneg_as_int_v2f64
8412660867SMatt Arsenault; CHECK-SAME: (<2 x double> [[X:%.*]]) {
8550a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg <2 x double> [[X]]
8650a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast <2 x double> [[TMP1]] to <2 x i64>
8712660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i64> [[XOR]]
8812660867SMatt Arsenault;
8912660867SMatt Arsenault  %bc = bitcast <2 x double> %x to <2 x i64>
9012660867SMatt Arsenault  %xor = xor <2 x i64> %bc, <i64 -9223372036854775808, i64 -9223372036854775808>
9112660867SMatt Arsenault  ret <2 x i64> %xor
9212660867SMatt Arsenault}
9312660867SMatt Arsenault
9412660867SMatt Arsenaultdefine i64 @fneg_as_int_f64_swap(double %x) {
9512660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_as_int_f64_swap
9612660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
9750a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg double [[X]]
9850a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast double [[TMP1]] to i64
9912660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[XOR]]
10012660867SMatt Arsenault;
10112660867SMatt Arsenault  %bc = bitcast double %x to i64
10212660867SMatt Arsenault  %xor = xor i64 -9223372036854775808, %bc
10312660867SMatt Arsenault  ret i64 %xor
10412660867SMatt Arsenault}
10512660867SMatt Arsenault
10612660867SMatt Arsenaultdefine i32 @fneg_as_int_f32(float %x) {
10712660867SMatt Arsenault; CHECK-LABEL: define i32 @fneg_as_int_f32
10812660867SMatt Arsenault; CHECK-SAME: (float [[X:%.*]]) {
10950a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg float [[X]]
11050a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast float [[TMP1]] to i32
11112660867SMatt Arsenault; CHECK-NEXT:    ret i32 [[XOR]]
11212660867SMatt Arsenault;
11312660867SMatt Arsenault  %bc = bitcast float %x to i32
11412660867SMatt Arsenault  %xor = xor i32 %bc, -2147483648
11512660867SMatt Arsenault  ret i32 %xor
11612660867SMatt Arsenault}
11712660867SMatt Arsenault
11812660867SMatt Arsenaultdefine <2 x i32> @fneg_as_int_v2f32(<2 x float> %x) {
11912660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fneg_as_int_v2f32
12012660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
12150a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg <2 x float> [[X]]
12250a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast <2 x float> [[TMP1]] to <2 x i32>
12312660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[XOR]]
12412660867SMatt Arsenault;
12512660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
12612660867SMatt Arsenault  %xor = xor <2 x i32> %bc, <i32 -2147483648, i32 -2147483648>
12712660867SMatt Arsenault  ret <2 x i32> %xor
12812660867SMatt Arsenault}
12912660867SMatt Arsenault
13012660867SMatt Arsenaultdefine <2 x i32> @not_fneg_as_int_v2f32_nonsplat(<2 x float> %x) {
13112660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @not_fneg_as_int_v2f32_nonsplat
13212660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
13312660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
13412660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor <2 x i32> [[BC]], <i32 -2147483648, i32 -2147483647>
13512660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[XOR]]
13612660867SMatt Arsenault;
13712660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
13812660867SMatt Arsenault  %xor = xor <2 x i32> %bc, <i32 -2147483648, i32 -2147483647>
13912660867SMatt Arsenault  ret <2 x i32> %xor
14012660867SMatt Arsenault}
14112660867SMatt Arsenault
142d9a5aa8eSNikita Popovdefine <3 x i32> @fneg_as_int_v3f32_poison(<3 x float> %x) {
143d9a5aa8eSNikita Popov; CHECK-LABEL: define <3 x i32> @fneg_as_int_v3f32_poison
14412660867SMatt Arsenault; CHECK-SAME: (<3 x float> [[X:%.*]]) {
14550a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x float> [[X]]
14650a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast <3 x float> [[TMP1]] to <3 x i32>
14712660867SMatt Arsenault; CHECK-NEXT:    ret <3 x i32> [[XOR]]
14812660867SMatt Arsenault;
14912660867SMatt Arsenault  %bc = bitcast <3 x float> %x to <3 x i32>
150d9a5aa8eSNikita Popov  %xor = xor <3 x i32> %bc, <i32 -2147483648, i32 poison, i32 -2147483648>
15112660867SMatt Arsenault  ret <3 x i32> %xor
15212660867SMatt Arsenault}
15312660867SMatt Arsenault
15412660867SMatt Arsenault; Make sure that only a bitcast is transformed.
15512660867SMatt Arsenaultdefine i64 @fneg_as_int_f64_not_bitcast(double %x) {
15612660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_as_int_f64_not_bitcast
15712660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
15812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = fptoui double [[X]] to i64
15912660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i64 [[BC]], -9223372036854775808
16012660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[XOR]]
16112660867SMatt Arsenault;
16212660867SMatt Arsenault  %bc = fptoui double %x to i64
16312660867SMatt Arsenault  %xor = xor i64 %bc, -9223372036854775808
16412660867SMatt Arsenault  ret i64 %xor
16512660867SMatt Arsenault}
16612660867SMatt Arsenault
16712660867SMatt Arsenaultdefine float @not_fneg_as_int_f32_bitcast_from_v2f16(<2 x half> %val) {
16812660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_as_int_f32_bitcast_from_v2f16
16912660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[VAL:%.*]]) {
17012660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x half> [[VAL]] to i32
17112660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[BITCAST]], -2147483648
17212660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[XOR]] to float
17312660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
17412660867SMatt Arsenault;
17512660867SMatt Arsenault  %bitcast = bitcast <2 x half> %val to i32
17612660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483648
17712660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
17812660867SMatt Arsenault  ret float %fneg
17912660867SMatt Arsenault}
18012660867SMatt Arsenault
18112660867SMatt Arsenaultdefine float @not_fneg_as_int_f32_bitcast_from_v2i16(<2 x i16> %val) {
18212660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_as_int_f32_bitcast_from_v2i16
18312660867SMatt Arsenault; CHECK-SAME: (<2 x i16> [[VAL:%.*]]) {
18412660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x i16> [[VAL]] to i32
18512660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[BITCAST]], -2147483648
18612660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[XOR]] to float
18712660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
18812660867SMatt Arsenault;
18912660867SMatt Arsenault  %bitcast = bitcast <2 x i16> %val to i32
19012660867SMatt Arsenault  %xor = xor i32 %bitcast, -2147483648
19112660867SMatt Arsenault  %fneg = bitcast i32 %xor to float
19212660867SMatt Arsenault  ret float %fneg
19312660867SMatt Arsenault}
19412660867SMatt Arsenault
19512660867SMatt Arsenaultdefine i128 @fneg_as_int_fp128_f64_mask(fp128 %x) {
19612660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_as_int_fp128_f64_mask
19712660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
19812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast fp128 [[X]] to i128
19912660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i128 [[BC]], -9223372036854775808
20012660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[XOR]]
20112660867SMatt Arsenault;
20212660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
20312660867SMatt Arsenault  %xor = xor i128 %bc, -9223372036854775808
20412660867SMatt Arsenault  ret i128 %xor
20512660867SMatt Arsenault}
20612660867SMatt Arsenault
20712660867SMatt Arsenaultdefine i128 @fneg_as_int_fp128_f128_mask(fp128 %x) {
20812660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_as_int_fp128_f128_mask
20912660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
21050a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg fp128 [[X]]
21150a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast fp128 [[TMP1]] to i128
21212660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[XOR]]
21312660867SMatt Arsenault;
21412660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
21512660867SMatt Arsenault  %xor = xor i128 %bc, -170141183460469231731687303715884105728
21612660867SMatt Arsenault  ret i128 %xor
21712660867SMatt Arsenault}
21812660867SMatt Arsenault
21912660867SMatt Arsenaultdefine i16 @fneg_as_int_f16(half %x) {
22012660867SMatt Arsenault; CHECK-LABEL: define i16 @fneg_as_int_f16
22112660867SMatt Arsenault; CHECK-SAME: (half [[X:%.*]]) {
22250a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg half [[X]]
22350a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast half [[TMP1]] to i16
22412660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[XOR]]
22512660867SMatt Arsenault;
22612660867SMatt Arsenault  %bc = bitcast half %x to i16
22712660867SMatt Arsenault  %xor = xor i16 %bc, -32768
22812660867SMatt Arsenault  ret i16 %xor
22912660867SMatt Arsenault}
23012660867SMatt Arsenault
23112660867SMatt Arsenaultdefine <2 x i16> @fneg_as_int_v2f16(<2 x half> %x) {
23212660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fneg_as_int_v2f16
23312660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[X:%.*]]) {
23450a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg <2 x half> [[X]]
23550a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast <2 x half> [[TMP1]] to <2 x i16>
23612660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[XOR]]
23712660867SMatt Arsenault;
23812660867SMatt Arsenault  %bc = bitcast <2 x half> %x to <2 x i16>
23912660867SMatt Arsenault  %xor = xor <2 x i16> %bc, <i16 -32768, i16 -32768>
24012660867SMatt Arsenault  ret <2 x i16> %xor
24112660867SMatt Arsenault}
24212660867SMatt Arsenault
24312660867SMatt Arsenaultdefine i16 @fneg_as_int_bf16(bfloat %x) {
24412660867SMatt Arsenault; CHECK-LABEL: define i16 @fneg_as_int_bf16
24512660867SMatt Arsenault; CHECK-SAME: (bfloat [[X:%.*]]) {
24650a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg bfloat [[X]]
24750a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast bfloat [[TMP1]] to i16
24812660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[XOR]]
24912660867SMatt Arsenault;
25012660867SMatt Arsenault  %bc = bitcast bfloat %x to i16
25112660867SMatt Arsenault  %xor = xor i16 %bc, -32768
25212660867SMatt Arsenault  ret i16 %xor
25312660867SMatt Arsenault}
25412660867SMatt Arsenault
25512660867SMatt Arsenaultdefine <2 x i16> @fneg_as_int_v2bf16(<2 x bfloat> %x) {
25612660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fneg_as_int_v2bf16
25712660867SMatt Arsenault; CHECK-SAME: (<2 x bfloat> [[X:%.*]]) {
25850a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg <2 x bfloat> [[X]]
25950a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast <2 x bfloat> [[TMP1]] to <2 x i16>
26012660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[XOR]]
26112660867SMatt Arsenault;
26212660867SMatt Arsenault  %bc = bitcast <2 x bfloat> %x to <2 x i16>
26312660867SMatt Arsenault  %xor = xor <2 x i16> %bc, <i16 -32768, i16 -32768>
26412660867SMatt Arsenault  ret <2 x i16> %xor
26512660867SMatt Arsenault}
26612660867SMatt Arsenault
26712660867SMatt Arsenaultdefine i80 @fneg_as_int_x86_fp80_f64_mask(x86_fp80 %x) {
26812660867SMatt Arsenault; CHECK-LABEL: define i80 @fneg_as_int_x86_fp80_f64_mask
26912660867SMatt Arsenault; CHECK-SAME: (x86_fp80 [[X:%.*]]) {
27050a9b3d8SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = fneg x86_fp80 [[X]]
27150a9b3d8SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = bitcast x86_fp80 [[TMP1]] to i80
27212660867SMatt Arsenault; CHECK-NEXT:    ret i80 [[XOR]]
27312660867SMatt Arsenault;
27412660867SMatt Arsenault  %bc = bitcast x86_fp80 %x to i80
27512660867SMatt Arsenault  %xor = xor i80 %bc, -604462909807314587353088
27612660867SMatt Arsenault  ret i80 %xor
27712660867SMatt Arsenault}
27812660867SMatt Arsenault
27912660867SMatt Arsenaultdefine i128 @fneg_as_int_ppc_fp128_f64_mask(ppc_fp128 %x) {
28012660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_as_int_ppc_fp128_f64_mask
28112660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
28212660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
28312660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i128 [[BC]], -9223372036854775808
28412660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[XOR]]
28512660867SMatt Arsenault;
28612660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
28712660867SMatt Arsenault  %xor = xor i128 %bc, -9223372036854775808
28812660867SMatt Arsenault  ret i128 %xor
28912660867SMatt Arsenault}
29012660867SMatt Arsenault
29112660867SMatt Arsenaultdefine i128 @fneg_as_int_ppc_fp128_f128_mask(ppc_fp128 %x) {
29212660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_as_int_ppc_fp128_f128_mask
29312660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
29412660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
29512660867SMatt Arsenault; CHECK-NEXT:    [[XOR:%.*]] = xor i128 [[BC]], -170141183460469231731687303715884105728
29612660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[XOR]]
29712660867SMatt Arsenault;
29812660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
29912660867SMatt Arsenault  %xor = xor i128 %bc, -170141183460469231731687303715884105728
30012660867SMatt Arsenault  ret i128 %xor
30112660867SMatt Arsenault}
302