188 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=instcombine %s | FileCheck %s3; RUN: opt -S -passes=instcombine -use-constant-fp-for-fixed-length-splat %s | FileCheck %s4 5define float @fabs_fneg_basic(float %x) {6; CHECK-LABEL: define float @fabs_fneg_basic(7; CHECK-SAME: float [[X:%.*]]) {8; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])9; CHECK-NEXT: ret float [[FABS]]10;11 %neg = fneg float %x12 %fabs = call float @llvm.fabs.f32(float %neg)13 ret float %fabs14}15 16define <2 x float> @fabs_fneg_v2f32(<2 x float> %x) {17; CHECK-LABEL: define <2 x float> @fabs_fneg_v2f32(18; CHECK-SAME: <2 x float> [[X:%.*]]) {19; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]])20; CHECK-NEXT: ret <2 x float> [[FABS]]21;22 %neg = fneg <2 x float> %x23 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %neg)24 ret <2 x float> %fabs25}26 27define double @fabs_fneg_f64(double %x) {28; CHECK-LABEL: define double @fabs_fneg_f64(29; CHECK-SAME: double [[X:%.*]]) {30; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X]])31; CHECK-NEXT: ret double [[FABS]]32;33 %neg = fneg double %x34 %fabs = call double @llvm.fabs.f64(double %neg)35 ret double %fabs36}37 38define <4 x double> @fabs_fneg_v4f64(<4 x double> %x) {39; CHECK-LABEL: define <4 x double> @fabs_fneg_v4f64(40; CHECK-SAME: <4 x double> [[X:%.*]]) {41; CHECK-NEXT: [[FABS:%.*]] = call <4 x double> @llvm.fabs.v4f64(<4 x double> [[X]])42; CHECK-NEXT: ret <4 x double> [[FABS]]43;44 %neg = fneg <4 x double> %x45 %fabs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %neg)46 ret <4 x double> %fabs47}48 49define half @fabs_fneg_f16(half %x) {50; CHECK-LABEL: define half @fabs_fneg_f16(51; CHECK-SAME: half [[X:%.*]]) {52; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X]])53; CHECK-NEXT: ret half [[FABS]]54;55 %neg = fneg half %x56 %fabs = call half @llvm.fabs.f16(half %neg)57 ret half %fabs58}59 60define float @fabs_copysign_nnan(float %x, float %y) {61; CHECK-LABEL: define float @fabs_copysign_nnan(62; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {63; CHECK-NEXT: [[FABS:%.*]] = call nnan float @llvm.fabs.f32(float [[X]])64; CHECK-NEXT: ret float [[FABS]]65;66 %copysign = call float @llvm.copysign.f32(float %x, float %y)67 %fabs = call nnan float @llvm.fabs.f32(float %copysign)68 ret float %fabs69}70 71 72define float @fabs_copysign_ninf(float %x, float %y) {73; CHECK-LABEL: define float @fabs_copysign_ninf(74; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {75; CHECK-NEXT: [[FABS:%.*]] = call ninf float @llvm.fabs.f32(float [[X]])76; CHECK-NEXT: ret float [[FABS]]77;78 %copysign = call float @llvm.copysign.f32(float %x, float %y)79 %fabs = call ninf float @llvm.fabs.f32(float %copysign)80 ret float %fabs81}82 83define float @fabs_copysign_nsz(float %x, float %y) {84; CHECK-LABEL: define float @fabs_copysign_nsz(85; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {86; CHECK-NEXT: [[FABS:%.*]] = call nsz float @llvm.fabs.f32(float [[X]])87; CHECK-NEXT: ret float [[FABS]]88;89 %copysign = call float @llvm.copysign.f32(float %x, float %y)90 %fabs = call nsz float @llvm.fabs.f32(float %copysign)91 ret float %fabs92}93 94define float @fabs_copysign_nnan_negative(float %x, float %y) {95; CHECK-LABEL: define float @fabs_copysign_nnan_negative(96; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {97; CHECK-NEXT: [[FABS:%.*]] = call nnan float @llvm.fabs.f32(float [[X]])98; CHECK-NEXT: ret float [[FABS]]99;100 %copysign = call float @llvm.copysign.f32(float %x, float %y)101 %fabs = call nnan float @llvm.fabs.f32(float %copysign)102 ret float %fabs103}104 105 106define float @fabs_copysign_ninf_negative(float %x, float %y) {107; CHECK-LABEL: define float @fabs_copysign_ninf_negative(108; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {109; CHECK-NEXT: [[FABS:%.*]] = call ninf float @llvm.fabs.f32(float [[X]])110; CHECK-NEXT: ret float [[FABS]]111;112 %copysign = call float @llvm.copysign.f32(float %x, float %y)113 %fabs = call ninf float @llvm.fabs.f32(float %copysign)114 ret float %fabs115}116 117define float @fabs_copysign_nsz_negative(float %x, float %y) {118; CHECK-LABEL: define float @fabs_copysign_nsz_negative(119; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {120; CHECK-NEXT: [[FABS:%.*]] = call nsz float @llvm.fabs.f32(float [[X]])121; CHECK-NEXT: ret float [[FABS]]122;123 %copysign = call float @llvm.copysign.f32(float %x, float %y)124 %fabs = call nsz float @llvm.fabs.f32(float %copysign)125 ret float %fabs126}127 128define float @fabs_fneg_no_fabs(float %x) {129; CHECK-LABEL: define float @fabs_fneg_no_fabs(130; CHECK-SAME: float [[X:%.*]]) {131; CHECK-NEXT: [[NEG:%.*]] = fneg float [[X]]132; CHECK-NEXT: ret float [[NEG]]133;134 %neg = fneg float %x135 ret float %neg136}137 138define <2 x float> @fabs_fneg_splat_v2f32(<2 x float> %x) {139; CHECK-LABEL: define <2 x float> @fabs_fneg_splat_v2f32(140; CHECK-SAME: <2 x float> [[X:%.*]]) {141; CHECK-NEXT: ret <2 x float> splat (float 2.000000e+00)142;143 %neg = fneg <2 x float> <float -2.0, float -2.0>144 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %neg)145 ret <2 x float> %fabs146}147 148 149define <2 x float> @fabs_fneg_splat_poison_v2f32(<2 x float> %x) {150; CHECK-LABEL: define <2 x float> @fabs_fneg_splat_poison_v2f32(151; CHECK-SAME: <2 x float> [[X:%.*]]) {152; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> <float -2.000000e+00, float poison>)153; CHECK-NEXT: ret <2 x float> [[FABS]]154;155 %neg = fneg <2 x float> <float 2.0, float poison>156 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %neg)157 ret <2 x float> %fabs158}159 160define <2 x float> @fabs_fneg_non_splat_v2f32(<2 x float> %x) {161; CHECK-LABEL: define <2 x float> @fabs_fneg_non_splat_v2f32(162; CHECK-SAME: <2 x float> [[X:%.*]]) {163; CHECK-NEXT: ret <2 x float> <float 2.000000e+00, float 3.000000e+00>164;165 %neg = fneg <2 x float> <float 2.0, float 3.0>166 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %neg)167 ret <2 x float> %fabs168}169 170declare void @use(float)171 172define float @fabs_fneg_multi_use(float %x) {173; CHECK-LABEL: define float @fabs_fneg_multi_use(174; CHECK-SAME: float [[X:%.*]]) {175; CHECK-NEXT: [[NEG:%.*]] = fneg float [[X]]176; CHECK-NEXT: call void @use(float [[NEG]])177; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])178; CHECK-NEXT: ret float [[FABS]]179;180 %neg = fneg float %x181 call void @use(float %neg)182 %fabs = call float @llvm.fabs.f32(float %neg)183 ret float %fabs184}185 186 187 188