xref: /llvm-project/llvm/test/Transforms/InstCombine/fneg-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 i32 @fneg_fabs_as_int_f32_noimplicitfloat(float %x) noimplicitfloat {
512660867SMatt Arsenault; CHECK-LABEL: define i32 @fneg_fabs_as_int_f32_noimplicitfloat
612660867SMatt Arsenault; CHECK-SAME: (float [[X:%.*]]) #[[ATTR0:[0-9]+]] {
712660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast float [[X]] to i32
812660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i32 [[BC]], -2147483648
912660867SMatt Arsenault; CHECK-NEXT:    ret i32 [[OR]]
1012660867SMatt Arsenault;
1112660867SMatt Arsenault  %bc = bitcast float %x to i32
1212660867SMatt Arsenault  %or = or i32 %bc, -2147483648
1312660867SMatt Arsenault  ret i32 %or
1412660867SMatt Arsenault}
1512660867SMatt Arsenault
1612660867SMatt Arsenaultdefine <2 x i32> @fneg_fabs_as_int_v2f32_noimplicitfloat(<2 x float> %x) noimplicitfloat {
1712660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fneg_fabs_as_int_v2f32_noimplicitfloat
1812660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) #[[ATTR0]] {
1912660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
20*38fffa63SPaul Walker; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[BC]], splat (i32 -2147483648)
2112660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[OR]]
2212660867SMatt Arsenault;
2312660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
2412660867SMatt Arsenault  %or = or <2 x i32> %bc, <i32 -2147483648, i32 -2147483648>
2512660867SMatt Arsenault  ret <2 x i32> %or
2612660867SMatt Arsenault}
2712660867SMatt Arsenault
2812660867SMatt Arsenaultdefine float @fneg_fabs_fabs_as_int_f32_and_or(float %val) {
2912660867SMatt Arsenault; CHECK-LABEL: define float @fneg_fabs_fabs_as_int_f32_and_or
3012660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
315c0da583SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
3270aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg float [[TMP1]]
3370aede22SMatt Arsenault; CHECK-NEXT:    ret float [[TMP2]]
3412660867SMatt Arsenault;
3512660867SMatt Arsenault  %bitcast = bitcast float %val to i32
3612660867SMatt Arsenault  %and = and i32 %bitcast, 2147483647
3712660867SMatt Arsenault  %or = or i32 %and, -2147483648
3812660867SMatt Arsenault  %fneg.fabs = bitcast i32 %or to float
3912660867SMatt Arsenault  ret float %fneg.fabs
4012660867SMatt Arsenault}
4112660867SMatt Arsenault
4212660867SMatt Arsenaultdefine float @fneg_fabs_as_int_f32_castback(float %val) {
4312660867SMatt Arsenault; CHECK-LABEL: define float @fneg_fabs_as_int_f32_castback
4412660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
4570aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
4670aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg float [[TMP1]]
4770aede22SMatt Arsenault; CHECK-NEXT:    ret float [[TMP2]]
4812660867SMatt Arsenault;
4912660867SMatt Arsenault  %bitcast = bitcast float %val to i32
5012660867SMatt Arsenault  %or = or i32 %bitcast, -2147483648
5112660867SMatt Arsenault  %fneg = bitcast i32 %or to float
5212660867SMatt Arsenault  ret float %fneg
5312660867SMatt Arsenault}
5412660867SMatt Arsenault
5512660867SMatt Arsenaultdefine float @not_fneg_fabs_as_int_f32_castback_wrongconst(float %val) {
5612660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_fabs_as_int_f32_castback_wrongconst
5712660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]]) {
5812660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
5912660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i32 [[BITCAST]], -2147483647
6012660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[OR]] to float
6112660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
6212660867SMatt Arsenault;
6312660867SMatt Arsenault  %bitcast = bitcast float %val to i32
6412660867SMatt Arsenault  %or = or i32 %bitcast, -2147483647
6512660867SMatt Arsenault  %fneg = bitcast i32 %or to float
6612660867SMatt Arsenault  ret float %fneg
6712660867SMatt Arsenault}
6812660867SMatt Arsenault
6912660867SMatt Arsenaultdefine float @fneg_fabs_as_int_f32_castback_multi_use(float %val, ptr %ptr) {
7012660867SMatt Arsenault; CHECK-LABEL: define float @fneg_fabs_as_int_f32_castback_multi_use
7112660867SMatt Arsenault; CHECK-SAME: (float [[VAL:%.*]], ptr [[PTR:%.*]]) {
7270aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[VAL]])
7370aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg float [[TMP1]]
7470aede22SMatt Arsenault; CHECK-NEXT:    store float [[TMP2]], ptr [[PTR]], align 4
7570aede22SMatt Arsenault; CHECK-NEXT:    ret float [[TMP2]]
7612660867SMatt Arsenault;
7712660867SMatt Arsenault  %bitcast = bitcast float %val to i32
7812660867SMatt Arsenault  %or = or i32 %bitcast, -2147483648
7912660867SMatt Arsenault  store i32 %or, ptr %ptr
8012660867SMatt Arsenault  %fneg = bitcast i32 %or to float
8112660867SMatt Arsenault  ret float %fneg
8212660867SMatt Arsenault}
8312660867SMatt Arsenault
8412660867SMatt Arsenaultdefine i64 @fneg_fabs_as_int_f64(double %x) {
8512660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_fabs_as_int_f64
8612660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
8770aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
8870aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg double [[TMP1]]
8970aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast double [[TMP2]] to i64
9012660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[OR]]
9112660867SMatt Arsenault;
9212660867SMatt Arsenault  %bc = bitcast double %x to i64
9312660867SMatt Arsenault  %or = or i64 %bc, -9223372036854775808
9412660867SMatt Arsenault  ret i64 %or
9512660867SMatt Arsenault}
9612660867SMatt Arsenault
9712660867SMatt Arsenaultdefine <2 x i64> @fneg_fabs_as_int_v2f64(<2 x double> %x) {
9812660867SMatt Arsenault; CHECK-LABEL: define <2 x i64> @fneg_fabs_as_int_v2f64
9912660867SMatt Arsenault; CHECK-SAME: (<2 x double> [[X:%.*]]) {
10070aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> [[X]])
10170aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg <2 x double> [[TMP1]]
10270aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast <2 x double> [[TMP2]] to <2 x i64>
10312660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i64> [[OR]]
10412660867SMatt Arsenault;
10512660867SMatt Arsenault  %bc = bitcast <2 x double> %x to <2 x i64>
10612660867SMatt Arsenault  %or = or <2 x i64> %bc, <i64 -9223372036854775808, i64 -9223372036854775808>
10712660867SMatt Arsenault  ret <2 x i64> %or
10812660867SMatt Arsenault}
10912660867SMatt Arsenault
11012660867SMatt Arsenaultdefine i64 @fneg_fabs_as_int_f64_swap(double %x) {
11112660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_fabs_as_int_f64_swap
11212660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
11370aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X]])
11470aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg double [[TMP1]]
11570aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast double [[TMP2]] to i64
11612660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[OR]]
11712660867SMatt Arsenault;
11812660867SMatt Arsenault  %bc = bitcast double %x to i64
11912660867SMatt Arsenault  %or = or i64 -9223372036854775808, %bc
12012660867SMatt Arsenault  ret i64 %or
12112660867SMatt Arsenault}
12212660867SMatt Arsenault
12312660867SMatt Arsenaultdefine i32 @fneg_fabs_as_int_f32(float %x) {
12412660867SMatt Arsenault; CHECK-LABEL: define i32 @fneg_fabs_as_int_f32
12512660867SMatt Arsenault; CHECK-SAME: (float [[X:%.*]]) {
12670aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
12770aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg float [[TMP1]]
12870aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast float [[TMP2]] to i32
12912660867SMatt Arsenault; CHECK-NEXT:    ret i32 [[OR]]
13012660867SMatt Arsenault;
13112660867SMatt Arsenault  %bc = bitcast float %x to i32
13212660867SMatt Arsenault  %or = or i32 %bc, -2147483648
13312660867SMatt Arsenault  ret i32 %or
13412660867SMatt Arsenault}
13512660867SMatt Arsenault
13612660867SMatt Arsenaultdefine <2 x i32> @fneg_fabs_as_int_v2f32(<2 x float> %x) {
13712660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @fneg_fabs_as_int_v2f32
13812660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
13970aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]])
14070aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg <2 x float> [[TMP1]]
14170aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast <2 x float> [[TMP2]] to <2 x i32>
14212660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[OR]]
14312660867SMatt Arsenault;
14412660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
14512660867SMatt Arsenault  %or = or <2 x i32> %bc, <i32 -2147483648, i32 -2147483648>
14612660867SMatt Arsenault  ret <2 x i32> %or
14712660867SMatt Arsenault}
14812660867SMatt Arsenault
14912660867SMatt Arsenaultdefine <2 x i32> @not_fneg_fabs_as_int_v2f32_nonsplat(<2 x float> %x) {
15012660867SMatt Arsenault; CHECK-LABEL: define <2 x i32> @not_fneg_fabs_as_int_v2f32_nonsplat
15112660867SMatt Arsenault; CHECK-SAME: (<2 x float> [[X:%.*]]) {
15212660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
15312660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[BC]], <i32 -2147483648, i32 -2147483647>
15412660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i32> [[OR]]
15512660867SMatt Arsenault;
15612660867SMatt Arsenault  %bc = bitcast <2 x float> %x to <2 x i32>
15712660867SMatt Arsenault  %or = or <2 x i32> %bc, <i32 -2147483648, i32 -2147483647>
15812660867SMatt Arsenault  ret <2 x i32> %or
15912660867SMatt Arsenault}
16012660867SMatt Arsenault
161d9a5aa8eSNikita Popovdefine <3 x i32> @fneg_fabs_as_int_v3f32_poison(<3 x float> %x) {
162d9a5aa8eSNikita Popov; CHECK-LABEL: define <3 x i32> @fneg_fabs_as_int_v3f32_poison
16312660867SMatt Arsenault; CHECK-SAME: (<3 x float> [[X:%.*]]) {
16470aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <3 x float> @llvm.fabs.v3f32(<3 x float> [[X]])
16570aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg <3 x float> [[TMP1]]
16670aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast <3 x float> [[TMP2]] to <3 x i32>
16712660867SMatt Arsenault; CHECK-NEXT:    ret <3 x i32> [[OR]]
16812660867SMatt Arsenault;
16912660867SMatt Arsenault  %bc = bitcast <3 x float> %x to <3 x i32>
170d9a5aa8eSNikita Popov  %or = or <3 x i32> %bc, <i32 -2147483648, i32 poison, i32 -2147483648>
17112660867SMatt Arsenault  ret <3 x i32> %or
17212660867SMatt Arsenault}
17312660867SMatt Arsenault
17412660867SMatt Arsenault; Make sure that only a bitcast is transformed.
17512660867SMatt Arsenaultdefine i64 @fneg_fabs_as_int_f64_not_bitcast(double %x) {
17612660867SMatt Arsenault; CHECK-LABEL: define i64 @fneg_fabs_as_int_f64_not_bitcast
17712660867SMatt Arsenault; CHECK-SAME: (double [[X:%.*]]) {
17812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = fptoui double [[X]] to i64
17912660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i64 [[BC]], -9223372036854775808
18012660867SMatt Arsenault; CHECK-NEXT:    ret i64 [[OR]]
18112660867SMatt Arsenault;
18212660867SMatt Arsenault  %bc = fptoui double %x to i64
18312660867SMatt Arsenault  %or = or i64 %bc, -9223372036854775808
18412660867SMatt Arsenault  ret i64 %or
18512660867SMatt Arsenault}
18612660867SMatt Arsenault
18712660867SMatt Arsenaultdefine float @not_fneg_fabs_as_int_f32_bitcast_from_v2f16(<2 x half> %val) {
18812660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_fabs_as_int_f32_bitcast_from_v2f16
18912660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[VAL:%.*]]) {
19012660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x half> [[VAL]] to i32
19112660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i32 [[BITCAST]], -2147483648
19212660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[OR]] to float
19312660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
19412660867SMatt Arsenault;
19512660867SMatt Arsenault  %bitcast = bitcast <2 x half> %val to i32
19612660867SMatt Arsenault  %or = or i32 %bitcast, -2147483648
19712660867SMatt Arsenault  %fneg = bitcast i32 %or to float
19812660867SMatt Arsenault  ret float %fneg
19912660867SMatt Arsenault}
20012660867SMatt Arsenault
20112660867SMatt Arsenaultdefine float @not_fneg_fabs_as_int_f32_bitcast_from_v2i16(<2 x i16> %val) {
20212660867SMatt Arsenault; CHECK-LABEL: define float @not_fneg_fabs_as_int_f32_bitcast_from_v2i16
20312660867SMatt Arsenault; CHECK-SAME: (<2 x i16> [[VAL:%.*]]) {
20412660867SMatt Arsenault; CHECK-NEXT:    [[BITCAST:%.*]] = bitcast <2 x i16> [[VAL]] to i32
20512660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i32 [[BITCAST]], -2147483648
20612660867SMatt Arsenault; CHECK-NEXT:    [[FNEG:%.*]] = bitcast i32 [[OR]] to float
20712660867SMatt Arsenault; CHECK-NEXT:    ret float [[FNEG]]
20812660867SMatt Arsenault;
20912660867SMatt Arsenault  %bitcast = bitcast <2 x i16> %val to i32
21012660867SMatt Arsenault  %or = or i32 %bitcast, -2147483648
21112660867SMatt Arsenault  %fneg = bitcast i32 %or to float
21212660867SMatt Arsenault  ret float %fneg
21312660867SMatt Arsenault}
21412660867SMatt Arsenault
21512660867SMatt Arsenaultdefine i128 @fneg_fabs_as_int_fp128_f64_mask(fp128 %x) {
21612660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_fabs_as_int_fp128_f64_mask
21712660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
21812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast fp128 [[X]] to i128
21912660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i128 [[BC]], -9223372036854775808
22012660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[OR]]
22112660867SMatt Arsenault;
22212660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
22312660867SMatt Arsenault  %or = or i128 %bc, -9223372036854775808
22412660867SMatt Arsenault  ret i128 %or
22512660867SMatt Arsenault}
22612660867SMatt Arsenault
22712660867SMatt Arsenaultdefine i128 @fneg_fabs_as_int_fp128_f128_mask(fp128 %x) {
22812660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_fabs_as_int_fp128_f128_mask
22912660867SMatt Arsenault; CHECK-SAME: (fp128 [[X:%.*]]) {
23070aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X]])
23170aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg fp128 [[TMP1]]
23270aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast fp128 [[TMP2]] to i128
23312660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[OR]]
23412660867SMatt Arsenault;
23512660867SMatt Arsenault  %bc = bitcast fp128 %x to i128
23612660867SMatt Arsenault  %or = or i128 %bc, -170141183460469231731687303715884105728
23712660867SMatt Arsenault  ret i128 %or
23812660867SMatt Arsenault}
23912660867SMatt Arsenault
24012660867SMatt Arsenaultdefine i16 @fneg_fabs_as_int_f16(half %x) {
24112660867SMatt Arsenault; CHECK-LABEL: define i16 @fneg_fabs_as_int_f16
24212660867SMatt Arsenault; CHECK-SAME: (half [[X:%.*]]) {
24370aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[X]])
24470aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg half [[TMP1]]
24570aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast half [[TMP2]] to i16
24612660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[OR]]
24712660867SMatt Arsenault;
24812660867SMatt Arsenault  %bc = bitcast half %x to i16
24912660867SMatt Arsenault  %or = or i16 %bc, -32768
25012660867SMatt Arsenault  ret i16 %or
25112660867SMatt Arsenault}
25212660867SMatt Arsenault
25312660867SMatt Arsenaultdefine <2 x i16> @fneg_fabs_as_int_v2f16(<2 x half> %x) {
25412660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fneg_fabs_as_int_v2f16
25512660867SMatt Arsenault; CHECK-SAME: (<2 x half> [[X:%.*]]) {
25670aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X]])
25770aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg <2 x half> [[TMP1]]
25870aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast <2 x half> [[TMP2]] to <2 x i16>
25912660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[OR]]
26012660867SMatt Arsenault;
26112660867SMatt Arsenault  %bc = bitcast <2 x half> %x to <2 x i16>
26212660867SMatt Arsenault  %or = or <2 x i16> %bc, <i16 -32768, i16 -32768>
26312660867SMatt Arsenault  ret <2 x i16> %or
26412660867SMatt Arsenault}
26512660867SMatt Arsenault
26612660867SMatt Arsenaultdefine i16 @fneg_fabs_as_int_bf16(bfloat %x) {
26712660867SMatt Arsenault; CHECK-LABEL: define i16 @fneg_fabs_as_int_bf16
26812660867SMatt Arsenault; CHECK-SAME: (bfloat [[X:%.*]]) {
26970aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call bfloat @llvm.fabs.bf16(bfloat [[X]])
27070aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg bfloat [[TMP1]]
27170aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast bfloat [[TMP2]] to i16
27212660867SMatt Arsenault; CHECK-NEXT:    ret i16 [[OR]]
27312660867SMatt Arsenault;
27412660867SMatt Arsenault  %bc = bitcast bfloat %x to i16
27512660867SMatt Arsenault  %or = or i16 %bc, -32768
27612660867SMatt Arsenault  ret i16 %or
27712660867SMatt Arsenault}
27812660867SMatt Arsenault
27912660867SMatt Arsenaultdefine <2 x i16> @fneg_fabs_as_int_v2bf16(<2 x bfloat> %x) {
28012660867SMatt Arsenault; CHECK-LABEL: define <2 x i16> @fneg_fabs_as_int_v2bf16
28112660867SMatt Arsenault; CHECK-SAME: (<2 x bfloat> [[X:%.*]]) {
28270aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x bfloat> @llvm.fabs.v2bf16(<2 x bfloat> [[X]])
28370aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg <2 x bfloat> [[TMP1]]
28470aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast <2 x bfloat> [[TMP2]] to <2 x i16>
28512660867SMatt Arsenault; CHECK-NEXT:    ret <2 x i16> [[OR]]
28612660867SMatt Arsenault;
28712660867SMatt Arsenault  %bc = bitcast <2 x bfloat> %x to <2 x i16>
28812660867SMatt Arsenault  %or = or <2 x i16> %bc, <i16 -32768, i16 -32768>
28912660867SMatt Arsenault  ret <2 x i16> %or
29012660867SMatt Arsenault}
29112660867SMatt Arsenault
29212660867SMatt Arsenaultdefine i80 @fneg_fabs_as_int_x86_fp80_f64_mask(x86_fp80 %x) {
29312660867SMatt Arsenault; CHECK-LABEL: define i80 @fneg_fabs_as_int_x86_fp80_f64_mask
29412660867SMatt Arsenault; CHECK-SAME: (x86_fp80 [[X:%.*]]) {
29570aede22SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call x86_fp80 @llvm.fabs.f80(x86_fp80 [[X]])
29670aede22SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = fneg x86_fp80 [[TMP1]]
29770aede22SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = bitcast x86_fp80 [[TMP2]] to i80
29812660867SMatt Arsenault; CHECK-NEXT:    ret i80 [[OR]]
29912660867SMatt Arsenault;
30012660867SMatt Arsenault  %bc = bitcast x86_fp80 %x to i80
30112660867SMatt Arsenault  %or = or i80 %bc, -604462909807314587353088
30212660867SMatt Arsenault  ret i80 %or
30312660867SMatt Arsenault}
30412660867SMatt Arsenault
30512660867SMatt Arsenaultdefine i128 @fneg_fabs_as_int_ppc_fp128_f64_mask(ppc_fp128 %x) {
30612660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_fabs_as_int_ppc_fp128_f64_mask
30712660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
30812660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
30912660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i128 [[BC]], -9223372036854775808
31012660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[OR]]
31112660867SMatt Arsenault;
31212660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
31312660867SMatt Arsenault  %or = or i128 %bc, -9223372036854775808
31412660867SMatt Arsenault  ret i128 %or
31512660867SMatt Arsenault}
31612660867SMatt Arsenault
31712660867SMatt Arsenaultdefine i128 @fneg_fabs_as_int_ppc_fp128_f128_mask(ppc_fp128 %x) {
31812660867SMatt Arsenault; CHECK-LABEL: define i128 @fneg_fabs_as_int_ppc_fp128_f128_mask
31912660867SMatt Arsenault; CHECK-SAME: (ppc_fp128 [[X:%.*]]) {
32012660867SMatt Arsenault; CHECK-NEXT:    [[BC:%.*]] = bitcast ppc_fp128 [[X]] to i128
32112660867SMatt Arsenault; CHECK-NEXT:    [[OR:%.*]] = or i128 [[BC]], -170141183460469231731687303715884105728
32212660867SMatt Arsenault; CHECK-NEXT:    ret i128 [[OR]]
32312660867SMatt Arsenault;
32412660867SMatt Arsenault  %bc = bitcast ppc_fp128 %x to i128
32512660867SMatt Arsenault  %or = or i128 %bc, -170141183460469231731687303715884105728
32612660867SMatt Arsenault  ret i128 %or
32712660867SMatt Arsenault}
328