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