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