brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.4 KiB · eea1dda Raw
355 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine %s | FileCheck %s3 4@var = external global i32, align 45 6; fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.07; https://alive2.llvm.org/ce/z/fib8cf8define void @denormal_input_preserve_sign_fcmp_olt_smallest_normalized(float %f32, double %f64, half %f16) #0 {9; CHECK-LABEL: @denormal_input_preserve_sign_fcmp_olt_smallest_normalized(10; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp oeq float [[F32:%.*]], 0.000000e+0011; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 112; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp oeq double [[F64:%.*]], 0.000000e+0013; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 114; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp oeq half [[F16:%.*]], 0xH000015; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 116; CHECK-NEXT:    [[CMPF32_FLAGS:%.*]] = fcmp oeq float [[F32]], 0.000000e+0017; CHECK-NEXT:    store volatile i1 [[CMPF32_FLAGS]], ptr @var, align 118; CHECK-NEXT:    ret void19;20  %f32.fabs = call float @llvm.fabs.f32(float %f32)21  %cmpf32 = fcmp olt float %f32.fabs, 0x381000000000000022  store volatile i1 %cmpf32, ptr @var23 24  %f64.fabs = call double @llvm.fabs.f64(double %f64)25  %cmpf64 = fcmp olt double %f64.fabs, 0x1000000000000026  store volatile i1 %cmpf64, ptr @var27 28  %f16.fabs = call half @llvm.fabs.f16(half %f16)29  %cmpf16 = fcmp olt half %f16.fabs, 0xH040030  store volatile i1 %cmpf16, ptr @var31 32  %f32.fabs.flags = call nsz nnan float @llvm.fabs.f32(float %f32)33  %cmpf32.flags = fcmp olt float %f32.fabs.flags, 0x381000000000000034  store volatile i1 %cmpf32.flags, ptr @var35 36  ret void37}38 39; fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.040; https://alive2.llvm.org/ce/z/xmqBXx41define void @denormal_input_preserve_sign_fcmp_uge_smallest_normalized(float %f32, double %f64, half %f16) #0 {42; CHECK-LABEL: @denormal_input_preserve_sign_fcmp_uge_smallest_normalized(43; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp une float [[F32:%.*]], 0.000000e+0044; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 145; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp une double [[F64:%.*]], 0.000000e+0046; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 147; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp une half [[F16:%.*]], 0xH000048; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 149; CHECK-NEXT:    ret void50;51  %f32.fabs = call float @llvm.fabs.f32(float %f32)52  %cmpf32 = fcmp uge float %f32.fabs, 0x381000000000000053  store volatile i1 %cmpf32, ptr @var54 55  %f64.fabs = call double @llvm.fabs.f64(double %f64)56  %cmpf64 = fcmp uge double %f64.fabs, 0x1000000000000057  store volatile i1 %cmpf64, ptr @var58 59  %f16.fabs = call half @llvm.fabs.f16(half %f16)60  %cmpf16 = fcmp uge half %f16.fabs, 0xH040061  store volatile i1 %cmpf16, ptr @var62  ret void63}64 65; fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.066; https://alive2.llvm.org/ce/z/ZucNzF67define void @denormal_input_preserve_sign_fcmp_oge_smallest_normalized(float %f32, double %f64, half %f16) #0 {68; CHECK-LABEL: @denormal_input_preserve_sign_fcmp_oge_smallest_normalized(69; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp one float [[F32:%.*]], 0.000000e+0070; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 171; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp one double [[F64:%.*]], 0.000000e+0072; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 173; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp one half [[F16:%.*]], 0xH000074; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 175; CHECK-NEXT:    ret void76;77  %f32.fabs = call float @llvm.fabs.f32(float %f32)78  %cmpf32 = fcmp oge float %f32.fabs, 0x381000000000000079  store volatile i1 %cmpf32, ptr @var80 81  %f64.fabs = call double @llvm.fabs.f64(double %f64)82  %cmpf64 = fcmp oge double %f64.fabs, 0x1000000000000083  store volatile i1 %cmpf64, ptr @var84 85  %f16.fabs = call half @llvm.fabs.f16(half %f16)86  %cmpf16 = fcmp oge half %f16.fabs, 0xH040087  store volatile i1 %cmpf16, ptr @var88  ret void89}90 91; fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.092; https://alive2.llvm.org/ce/z/csAhZ293define void @denormal_input_preserve_sign_fcmp_ult_smallest_normalized(float %f32, double %f64, half %f16) #0 {94; CHECK-LABEL: @denormal_input_preserve_sign_fcmp_ult_smallest_normalized(95; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp ueq float [[F32:%.*]], 0.000000e+0096; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 197; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp ueq double [[F64:%.*]], 0.000000e+0098; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 199; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp ueq half [[F16:%.*]], 0xH0000100; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1101; CHECK-NEXT:    ret void102;103  %f32.fabs = call float @llvm.fabs.f32(float %f32)104  %cmpf32 = fcmp ult float %f32.fabs, 0x3810000000000000105  store volatile i1 %cmpf32, ptr @var106 107  %f64.fabs = call double @llvm.fabs.f64(double %f64)108  %cmpf64 = fcmp ult double %f64.fabs, 0x10000000000000109  store volatile i1 %cmpf64, ptr @var110 111  %f16.fabs = call half @llvm.fabs.f16(half %f16)112  %cmpf16 = fcmp ult half %f16.fabs, 0xH0400113  store volatile i1 %cmpf16, ptr @var114  ret void115}116 117define void @denormal_input_preserve_sign_vector_fcmp_olt_smallest_normalized(<2 x float> %f32, <2 x double> %f64, <2 x half> %f16) #0 {118; CHECK-LABEL: @denormal_input_preserve_sign_vector_fcmp_olt_smallest_normalized(119; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp oeq <2 x float> [[F32:%.*]], zeroinitializer120; CHECK-NEXT:    store volatile <2 x i1> [[CMPF32]], ptr @var, align 1121; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp oeq <2 x double> [[F64:%.*]], zeroinitializer122; CHECK-NEXT:    store volatile <2 x i1> [[CMPF64]], ptr @var, align 1123; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp oeq <2 x half> [[F16:%.*]], zeroinitializer124; CHECK-NEXT:    store volatile <2 x i1> [[CMPF16]], ptr @var, align 1125; CHECK-NEXT:    ret void126;127  %f32.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %f32)128  %cmpf32 = fcmp olt <2 x float> %f32.fabs, <float 0x3810000000000000, float 0x3810000000000000>129  store volatile <2 x i1> %cmpf32, ptr @var130 131  %f64.fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %f64)132  %cmpf64 = fcmp olt <2 x double> %f64.fabs, <double 0x10000000000000, double 0x10000000000000>133  store volatile <2 x i1> %cmpf64, ptr @var134 135  %f16.fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %f16)136  %cmpf16 = fcmp olt <2 x half> %f16.fabs, <half 0xH0400, half 0xH0400>137  store volatile <2 x i1> %cmpf16, ptr @var138  ret void139}140 141define void @denormal_input_preserve_sign_vector_fcmp_uge_smallest_normalized(<2 x float> %f32, <2 x double> %f64, <2 x half> %f16) #0 {142; CHECK-LABEL: @denormal_input_preserve_sign_vector_fcmp_uge_smallest_normalized(143; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp une <2 x float> [[F32:%.*]], zeroinitializer144; CHECK-NEXT:    store volatile <2 x i1> [[CMPF32]], ptr @var, align 1145; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp une <2 x double> [[F64:%.*]], zeroinitializer146; CHECK-NEXT:    store volatile <2 x i1> [[CMPF64]], ptr @var, align 1147; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp une <2 x half> [[F16:%.*]], zeroinitializer148; CHECK-NEXT:    store volatile <2 x i1> [[CMPF16]], ptr @var, align 1149; CHECK-NEXT:    ret void150;151  %f32.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %f32)152  %cmpf32 = fcmp uge <2 x float> %f32.fabs, <float 0x3810000000000000, float 0x3810000000000000>153  store volatile <2 x i1> %cmpf32, ptr @var154 155  %f64.fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %f64)156  %cmpf64 = fcmp uge <2 x double> %f64.fabs, <double 0x10000000000000, double 0x10000000000000>157  store volatile <2 x i1> %cmpf64, ptr @var158 159  %f16.fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %f16)160  %cmpf16 = fcmp uge <2 x half> %f16.fabs, <half 0xH0400, half 0xH0400>161  store volatile <2 x i1> %cmpf16, ptr @var162  ret void163}164 165define void @denormal_input_preserve_sign_vector_fcmp_oge_smallest_normalized(<2 x float> %f32, <2 x double> %f64, <2 x half> %f16) #0 {166; CHECK-LABEL: @denormal_input_preserve_sign_vector_fcmp_oge_smallest_normalized(167; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp one <2 x float> [[F32:%.*]], zeroinitializer168; CHECK-NEXT:    store volatile <2 x i1> [[CMPF32]], ptr @var, align 1169; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp one <2 x double> [[F64:%.*]], zeroinitializer170; CHECK-NEXT:    store volatile <2 x i1> [[CMPF64]], ptr @var, align 1171; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp one <2 x half> [[F16:%.*]], zeroinitializer172; CHECK-NEXT:    store volatile <2 x i1> [[CMPF16]], ptr @var, align 1173; CHECK-NEXT:    ret void174;175  %f32.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %f32)176  %cmpf32 = fcmp oge <2 x float> %f32.fabs, <float 0x3810000000000000, float 0x3810000000000000>177  store volatile <2 x i1> %cmpf32, ptr @var178 179  %f64.fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %f64)180  %cmpf64 = fcmp oge <2 x double> %f64.fabs, <double 0x10000000000000, double 0x10000000000000>181  store volatile <2 x i1> %cmpf64, ptr @var182 183  %f16.fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %f16)184  %cmpf16 = fcmp oge <2 x half> %f16.fabs, <half 0xH0400, half 0xH0400>185  store volatile <2 x i1> %cmpf16, ptr @var186  ret void187}188 189define void @denormal_input_preserve_sign_vector_fcmp_ult_smallest_normalized(<2 x float> %f32, <2 x double> %f64, <2 x half> %f16) #0 {190; CHECK-LABEL: @denormal_input_preserve_sign_vector_fcmp_ult_smallest_normalized(191; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp ueq <2 x float> [[F32:%.*]], zeroinitializer192; CHECK-NEXT:    store volatile <2 x i1> [[CMPF32]], ptr @var, align 1193; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp ueq <2 x double> [[F64:%.*]], zeroinitializer194; CHECK-NEXT:    store volatile <2 x i1> [[CMPF64]], ptr @var, align 1195; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp ueq <2 x half> [[F16:%.*]], zeroinitializer196; CHECK-NEXT:    store volatile <2 x i1> [[CMPF16]], ptr @var, align 1197; CHECK-NEXT:    ret void198;199  %f32.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %f32)200  %cmpf32 = fcmp ult <2 x float> %f32.fabs, <float 0x3810000000000000, float 0x3810000000000000>201  store volatile <2 x i1> %cmpf32, ptr @var202 203  %f64.fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %f64)204  %cmpf64 = fcmp ult <2 x double> %f64.fabs, <double 0x10000000000000, double 0x10000000000000>205  store volatile <2 x i1> %cmpf64, ptr @var206 207  %f16.fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %f16)208  %cmpf16 = fcmp ult <2 x half> %f16.fabs, <half 0xH0400, half 0xH0400>209  store volatile <2 x i1> %cmpf16, ptr @var210  ret void211}212 213; fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0214; https://alive2.llvm.org/ce/z/mpduXS215define void @denormal_input_positive_zero_fcmp_olt_smallest_normalized(float %f32, double %f64, half %f16) #1 {216; CHECK-LABEL: @denormal_input_positive_zero_fcmp_olt_smallest_normalized(217; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp oeq float [[F32:%.*]], 0.000000e+00218; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 1219; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp oeq double [[F64:%.*]], 0.000000e+00220; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 1221; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp oeq half [[F16:%.*]], 0xH0000222; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1223; CHECK-NEXT:    ret void224;225  %f32.fabs = call float @llvm.fabs.f32(float %f32)226  %cmpf32 = fcmp olt float %f32.fabs, 0x3810000000000000227  store volatile i1 %cmpf32, ptr @var228 229  %f64.fabs = call double @llvm.fabs.f64(double %f64)230  %cmpf64 = fcmp olt double %f64.fabs, 0x10000000000000231  store volatile i1 %cmpf64, ptr @var232 233  %f16.fabs = call half @llvm.fabs.f16(half %f16)234  %cmpf16 = fcmp olt half %f16.fabs, 0xH0400235  store volatile i1 %cmpf16, ptr @var236  ret void237}238 239; Should not fold with IEEE inputs.240define void @denormal_input_ieee(float %f32, double %f64, half %f16) #2 {241; CHECK-LABEL: @denormal_input_ieee(242; CHECK-NEXT:    [[F32_FABS:%.*]] = call float @llvm.fabs.f32(float [[F32:%.*]])243; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp olt float [[F32_FABS]], 0x3810000000000000244; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 1245; CHECK-NEXT:    [[F64_FABS:%.*]] = call double @llvm.fabs.f64(double [[F64:%.*]])246; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp olt double [[F64_FABS]], 0x10000000000000247; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 1248; CHECK-NEXT:    [[F16_FABS:%.*]] = call half @llvm.fabs.f16(half [[F16:%.*]])249; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp olt half [[F16_FABS]], 0xH0400250; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1251; CHECK-NEXT:    ret void252;253  %f32.fabs = call float @llvm.fabs.f32(float %f32)254  %cmpf32 = fcmp olt float %f32.fabs, 0x3810000000000000255  store volatile i1 %cmpf32, ptr @var256 257  %f64.fabs = call double @llvm.fabs.f64(double %f64)258  %cmpf64 = fcmp olt double %f64.fabs, 0x10000000000000259  store volatile i1 %cmpf64, ptr @var260 261  %f16.fabs = call half @llvm.fabs.f16(half %f16)262  %cmpf16 = fcmp olt half %f16.fabs, 0xH0400263  store volatile i1 %cmpf16, ptr @var264  ret void265}266 267; Only f32 case should fold.268define void @denormal_input_preserve_sign_f32_only(float %f32, double %f64, half %f16) #3 {269; CHECK-LABEL: @denormal_input_preserve_sign_f32_only(270; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp oeq float [[F32:%.*]], 0.000000e+00271; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 1272; CHECK-NEXT:    [[F64_FABS:%.*]] = call double @llvm.fabs.f64(double [[F64:%.*]])273; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp olt double [[F64_FABS]], 0x10000000000000274; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 1275; CHECK-NEXT:    [[F16_FABS:%.*]] = call half @llvm.fabs.f16(half [[F16:%.*]])276; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp olt half [[F16_FABS]], 0xH0400277; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1278; CHECK-NEXT:    ret void279;280  %f32.fabs = call float @llvm.fabs.f32(float %f32)281  %cmpf32 = fcmp olt float %f32.fabs, 0x3810000000000000282  store volatile i1 %cmpf32, ptr @var283 284  %f64.fabs = call double @llvm.fabs.f64(double %f64)285  %cmpf64 = fcmp olt double %f64.fabs, 0x10000000000000286  store volatile i1 %cmpf64, ptr @var287 288  %f16.fabs = call half @llvm.fabs.f16(half %f16)289  %cmpf16 = fcmp olt half %f16.fabs, 0xH0400290  store volatile i1 %cmpf16, ptr @var291  ret void292}293 294define void @wrong_fcmp_type_ole(float %f32, double %f64, half %f16) #0 {295; CHECK-LABEL: @wrong_fcmp_type_ole(296; CHECK-NEXT:    [[F32_FABS:%.*]] = call float @llvm.fabs.f32(float [[F32:%.*]])297; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp ole float [[F32_FABS]], 0x3810000000000000298; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 1299; CHECK-NEXT:    [[F64_FABS:%.*]] = call double @llvm.fabs.f64(double [[F64:%.*]])300; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp ole double [[F64_FABS]], 0x10000000000000301; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 1302; CHECK-NEXT:    [[F16_FABS:%.*]] = call half @llvm.fabs.f16(half [[F16:%.*]])303; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp ole half [[F16_FABS]], 0xH0400304; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1305; CHECK-NEXT:    ret void306;307  %f32.fabs = call float @llvm.fabs.f32(float %f32)308  %cmpf32 = fcmp ole float %f32.fabs, 0x3810000000000000309  store volatile i1 %cmpf32, ptr @var310 311  %f64.fabs = call double @llvm.fabs.f64(double %f64)312  %cmpf64 = fcmp ole double %f64.fabs, 0x10000000000000313  store volatile i1 %cmpf64, ptr @var314 315  %f16.fabs = call half @llvm.fabs.f16(half %f16)316  %cmpf16 = fcmp ole half %f16.fabs, 0xH0400317  store volatile i1 %cmpf16, ptr @var318  ret void319}320 321define void @missing_fabs(float %f32, double %f64, half %f16) #0 {322; CHECK-LABEL: @missing_fabs(323; CHECK-NEXT:    [[CMPF32:%.*]] = fcmp olt float [[F32:%.*]], 0x3810000000000000324; CHECK-NEXT:    store volatile i1 [[CMPF32]], ptr @var, align 1325; CHECK-NEXT:    [[CMPF64:%.*]] = fcmp olt double [[F64:%.*]], 0x10000000000000326; CHECK-NEXT:    store volatile i1 [[CMPF64]], ptr @var, align 1327; CHECK-NEXT:    [[CMPF16:%.*]] = fcmp olt half [[F16:%.*]], 0xH0400328; CHECK-NEXT:    store volatile i1 [[CMPF16]], ptr @var, align 1329; CHECK-NEXT:    ret void330;331  %cmpf32 = fcmp olt float %f32, 0x3810000000000000332  store volatile i1 %cmpf32, ptr @var333 334  %cmpf64 = fcmp olt double %f64, 0x10000000000000335  store volatile i1 %cmpf64, ptr @var336 337  %cmpf16 = fcmp olt half %f16, 0xH0400338  store volatile i1 %cmpf16, ptr @var339  ret void340}341 342declare float @llvm.fabs.f32(float)343declare <2 x float> @llvm.fabs.v2f32(<2 x float>)344 345declare half @llvm.fabs.f16(half)346declare <2 x half> @llvm.fabs.v2f16(<2 x half>)347 348declare double @llvm.fabs.f64(double)349declare <2 x double> @llvm.fabs.v2f64(<2 x double>)350 351attributes #0 = { "denormal-fp-math"="ieee,preserve-sign" }352attributes #1 = { "denormal-fp-math"="ieee,positive-zero" }353attributes #2 = { "denormal-fp-math"="ieee,ieee" }354attributes #3 = { "denormal-fp-math-f32"="ieee,preserve-sign" }355