brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.1 KiB · a65b73b Raw
498 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; 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 @test(float %x) nounwind  {6; CHECK-LABEL: @test(7; CHECK-NEXT:    [[T34:%.*]] = fadd float [[X:%.*]], 0.000000e+008; CHECK-NEXT:    ret float [[T34]]9;10  %t1 = fpext float %x to double11  %t3 = fadd double %t1, 0.000000e+0012  %t34 = fptrunc double %t3 to float13  ret float %t3414}15 16define float @test2(float %x, float %y) nounwind  {17; CHECK-LABEL: @test2(18; CHECK-NEXT:    [[T56:%.*]] = fmul float [[X:%.*]], [[Y:%.*]]19; CHECK-NEXT:    ret float [[T56]]20;21  %t1 = fpext float %x to double22  %t23 = fpext float %y to double23  %t5 = fmul double %t1, %t2324  %t56 = fptrunc double %t5 to float25  ret float %t5626}27 28define float @test3(float %x, float %y) nounwind  {29; CHECK-LABEL: @test3(30; CHECK-NEXT:    [[T56:%.*]] = fdiv float [[X:%.*]], [[Y:%.*]]31; CHECK-NEXT:    ret float [[T56]]32;33  %t1 = fpext float %x to double34  %t23 = fpext float %y to double35  %t5 = fdiv double %t1, %t2336  %t56 = fptrunc double %t5 to float37  ret float %t5638}39 40define float @test4(float %x) nounwind  {41; CHECK-LABEL: @test4(42; CHECK-NEXT:    [[T34:%.*]] = fneg float [[X:%.*]]43; CHECK-NEXT:    ret float [[T34]]44;45  %t1 = fpext float %x to double46  %t2 = fsub double -0.000000e+00, %t147  %t34 = fptrunc double %t2 to float48  ret float %t3449}50 51define float @test4_unary_fneg(float %x) nounwind  {52; CHECK-LABEL: @test4_unary_fneg(53; CHECK-NEXT:    [[T34:%.*]] = fneg float [[X:%.*]]54; CHECK-NEXT:    ret float [[T34]]55;56  %t1 = fpext float %x to double57  %t2 = fneg double %t158  %t34 = fptrunc double %t2 to float59  ret float %t3460}61 62; Test with vector splat constant63define <2 x float> @test5(<2 x float> %x) nounwind  {64; CHECK-LABEL: @test5(65; CHECK-NEXT:    [[T34:%.*]] = fadd <2 x float> [[X:%.*]], zeroinitializer66; CHECK-NEXT:    ret <2 x float> [[T34]]67;68  %t1 = fpext <2 x float> %x to <2 x double>69  %t3 = fadd <2 x double> %t1, <double 0.000000e+00, double 0.000000e+00>70  %t34 = fptrunc <2 x double> %t3 to <2 x float>71  ret <2 x float> %t3472}73 74; Test with a non-splat constant75define <2 x float> @test6(<2 x float> %x) nounwind  {76; CHECK-LABEL: @test6(77; CHECK-NEXT:    [[T34:%.*]] = fadd <2 x float> [[X:%.*]], <float 0.000000e+00, float -0.000000e+00>78; CHECK-NEXT:    ret <2 x float> [[T34]]79;80  %t1 = fpext <2 x float> %x to <2 x double>81  %t3 = fadd <2 x double> %t1, <double 0.000000e+00, double -0.000000e+00>82  %t34 = fptrunc <2 x double> %t3 to <2 x float>83  ret <2 x float> %t3484}85 86; Test with an undef element87define <2 x float> @test6_undef(<2 x float> %x) nounwind  {88; CHECK-LABEL: @test6_undef(89; CHECK-NEXT:    [[T34:%.*]] = fadd <2 x float> [[X:%.*]], <float 0.000000e+00, float undef>90; CHECK-NEXT:    ret <2 x float> [[T34]]91;92  %t1 = fpext <2 x float> %x to <2 x double>93  %t3 = fadd <2 x double> %t1, <double 0.000000e+00, double undef>94  %t34 = fptrunc <2 x double> %t3 to <2 x float>95  ret <2 x float> %t3496}97 98define <2 x float> @not_half_shrinkable(<2 x float> %x) {99; CHECK-LABEL: @not_half_shrinkable(100; CHECK-NEXT:    [[R:%.*]] = fadd <2 x float> [[X:%.*]], <float 0.000000e+00, float 2.049000e+03>101; CHECK-NEXT:    ret <2 x float> [[R]]102;103  %ext = fpext <2 x float> %x to <2 x double>104  %add = fadd <2 x double> %ext, <double 0.0, double 2049.0>105  %r = fptrunc <2 x double> %add to <2 x float>106  ret <2 x float>  %r107}108 109define half @test7(float %a) nounwind {110; CHECK-LABEL: @test7(111; CHECK-NEXT:    [[Z:%.*]] = fptrunc float [[A:%.*]] to half112; CHECK-NEXT:    ret half [[Z]]113;114  %y = fpext float %a to double115  %z = fptrunc double %y to half116  ret half %z117}118 119define float @test8(half %a) nounwind {120; CHECK-LABEL: @test8(121; CHECK-NEXT:    [[Z:%.*]] = fpext half [[A:%.*]] to float122; CHECK-NEXT:    ret float [[Z]]123;124  %y = fpext half %a to double125  %z = fptrunc double %y to float126  ret float %z127}128 129define float @test9(half %x, half %y) nounwind  {130; CHECK-LABEL: @test9(131; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float132; CHECK-NEXT:    [[TMP2:%.*]] = fpext half [[Y:%.*]] to float133; CHECK-NEXT:    [[T56:%.*]] = fmul float [[TMP1]], [[TMP2]]134; CHECK-NEXT:    ret float [[T56]]135;136  %t1 = fpext half %x to double137  %t23 = fpext half %y to double138  %t5 = fmul double %t1, %t23139  %t56 = fptrunc double %t5 to float140  ret float %t56141}142 143define float @test10(half %x, float %y) nounwind  {144; CHECK-LABEL: @test10(145; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float146; CHECK-NEXT:    [[T56:%.*]] = fmul float [[Y:%.*]], [[TMP1]]147; CHECK-NEXT:    ret float [[T56]]148;149  %t1 = fpext half %x to double150  %t23 = fpext float %y to double151  %t5 = fmul double %t1, %t23152  %t56 = fptrunc double %t5 to float153  ret float %t56154}155 156define float @test11(half %x) nounwind  {157; CHECK-LABEL: @test11(158; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float159; CHECK-NEXT:    [[T34:%.*]] = fadd float [[TMP1]], 0.000000e+00160; CHECK-NEXT:    ret float [[T34]]161;162  %t1 = fpext half %x to double163  %t3 = fadd double %t1, 0.000000e+00164  %t34 = fptrunc double %t3 to float165  ret float %t34166}167 168define float @test12(float %x, half %y) nounwind  {169; CHECK-LABEL: @test12(170; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[Y:%.*]] to float171; CHECK-NEXT:    [[T34:%.*]] = fadd float [[X:%.*]], [[TMP1]]172; CHECK-NEXT:    ret float [[T34]]173;174  %t1 = fpext float %x to double175  %t2 = fpext half %y to double176  %t3 = fadd double %t1, %t2177  %t34 = fptrunc double %t3 to float178  ret float %t34179}180 181define float @test13(half %x, float %y) nounwind  {182; CHECK-LABEL: @test13(183; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float184; CHECK-NEXT:    [[T56:%.*]] = fdiv float [[TMP1]], [[Y:%.*]]185; CHECK-NEXT:    ret float [[T56]]186;187  %t1 = fpext half %x to double188  %t23 = fpext float %y to double189  %t5 = fdiv double %t1, %t23190  %t56 = fptrunc double %t5 to float191  ret float %t56192}193 194define float @test14(float %x, half %y) nounwind  {195; CHECK-LABEL: @test14(196; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[Y:%.*]] to float197; CHECK-NEXT:    [[T56:%.*]] = fdiv float [[X:%.*]], [[TMP1]]198; CHECK-NEXT:    ret float [[T56]]199;200  %t1 = fpext float %x to double201  %t23 = fpext half %y to double202  %t5 = fdiv double %t1, %t23203  %t56 = fptrunc double %t5 to float204  ret float %t56205}206 207define float @test15(half %x, half %y) nounwind  {208; CHECK-LABEL: @test15(209; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float210; CHECK-NEXT:    [[TMP2:%.*]] = fpext half [[Y:%.*]] to float211; CHECK-NEXT:    [[T56:%.*]] = fdiv float [[TMP1]], [[TMP2]]212; CHECK-NEXT:    ret float [[T56]]213;214  %t1 = fpext half %x to double215  %t23 = fpext half %y to double216  %t5 = fdiv double %t1, %t23217  %t56 = fptrunc double %t5 to float218  ret float %t56219}220 221define float @test16(half %x, float %y) nounwind  {222; CHECK-LABEL: @test16(223; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[X:%.*]] to float224; CHECK-NEXT:    [[TMP2:%.*]] = frem float [[TMP1]], [[Y:%.*]]225; CHECK-NEXT:    ret float [[TMP2]]226;227  %t1 = fpext half %x to double228  %t23 = fpext float %y to double229  %t5 = frem double %t1, %t23230  %t56 = fptrunc double %t5 to float231  ret float %t56232}233 234define float @test17(float %x, half %y) nounwind  {235; CHECK-LABEL: @test17(236; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[Y:%.*]] to float237; CHECK-NEXT:    [[TMP2:%.*]] = frem float [[X:%.*]], [[TMP1]]238; CHECK-NEXT:    ret float [[TMP2]]239;240  %t1 = fpext float %x to double241  %t23 = fpext half %y to double242  %t5 = frem double %t1, %t23243  %t56 = fptrunc double %t5 to float244  ret float %t56245}246 247define float @test18(half %x, half %y) nounwind  {248; CHECK-LABEL: @test18(249; CHECK-NEXT:    [[TMP1:%.*]] = frem half [[X:%.*]], [[Y:%.*]]250; CHECK-NEXT:    [[T56:%.*]] = fpext half [[TMP1]] to float251; CHECK-NEXT:    ret float [[T56]]252;253  %t1 = fpext half %x to double254  %t23 = fpext half %y to double255  %t5 = frem double %t1, %t23256  %t56 = fptrunc double %t5 to float257  ret float %t56258}259 260; Convert from integer is exact, so convert directly to double.261 262define double @ItoFtoF_s25_f32_f64(i25 %i) {263; CHECK-LABEL: @ItoFtoF_s25_f32_f64(264; CHECK-NEXT:    [[R:%.*]] = sitofp i25 [[I:%.*]] to double265; CHECK-NEXT:    ret double [[R]]266;267  %x = sitofp i25 %i to float268  %r = fpext float %x to double269  ret double %r270}271 272; Convert from integer is exact, so convert directly to fp128.273 274define fp128 @ItoFtoF_u24_f32_f128(i24 %i) {275; CHECK-LABEL: @ItoFtoF_u24_f32_f128(276; CHECK-NEXT:    [[R:%.*]] = uitofp i24 [[I:%.*]] to fp128277; CHECK-NEXT:    ret fp128 [[R]]278;279  %x = uitofp i24 %i to float280  %r = fpext float %x to fp128281  ret fp128 %r282}283 284; Negative test - intermediate rounding in float type.285 286define double @ItoFtoF_s26_f32_f64(i26 %i) {287; CHECK-LABEL: @ItoFtoF_s26_f32_f64(288; CHECK-NEXT:    [[X:%.*]] = sitofp i26 [[I:%.*]] to float289; CHECK-NEXT:    [[R:%.*]] = fpext float [[X]] to double290; CHECK-NEXT:    ret double [[R]]291;292  %x = sitofp i26 %i to float293  %r = fpext float %x to double294  ret double %r295}296 297; Negative test - intermediate rounding in float type.298 299define double @ItoFtoF_u25_f32_f64(i25 %i) {300; CHECK-LABEL: @ItoFtoF_u25_f32_f64(301; CHECK-NEXT:    [[X:%.*]] = uitofp i25 [[I:%.*]] to float302; CHECK-NEXT:    [[R:%.*]] = fpext float [[X]] to double303; CHECK-NEXT:    ret double [[R]]304;305  %x = uitofp i25 %i to float306  %r = fpext float %x to double307  ret double %r308}309 310; UB on overflow guarantees that the input is small enough to fit in i32.311 312define double @FtoItoFtoF_f32_s32_f32_f64(float %f) {313; CHECK-LABEL: @FtoItoFtoF_f32_s32_f32_f64(314; CHECK-NEXT:    [[I:%.*]] = fptosi float [[F:%.*]] to i32315; CHECK-NEXT:    [[R:%.*]] = sitofp i32 [[I]] to double316; CHECK-NEXT:    ret double [[R]]317;318  %i = fptosi float %f to i32319  %x = sitofp i32 %i to float320  %r = fpext float %x to double321  ret double %r322}323 324declare void @use_i32(i32)325declare void @use_f32(float)326 327; Extra uses are ok; unsigned is ok.328 329define double @FtoItoFtoF_f32_u32_f32_f64_extra_uses(float %f) {330; CHECK-LABEL: @FtoItoFtoF_f32_u32_f32_f64_extra_uses(331; CHECK-NEXT:    [[I:%.*]] = fptoui float [[F:%.*]] to i32332; CHECK-NEXT:    call void @use_i32(i32 [[I]])333; CHECK-NEXT:    [[X:%.*]] = uitofp i32 [[I]] to float334; CHECK-NEXT:    call void @use_f32(float [[X]])335; CHECK-NEXT:    [[R:%.*]] = uitofp i32 [[I]] to double336; CHECK-NEXT:    ret double [[R]]337;338  %i = fptoui float %f to i32339  call void @use_i32(i32 %i)340  %x = uitofp i32 %i to float341  call void @use_f32(float %x)342  %r = fpext float %x to double343  ret double %r344}345 346; Vectors are ok; initial type can be smaller than intermediate type.347 348define <3 x double> @FtoItoFtoF_v3f16_v3s32_v3f32_v3f64(<3 x half> %f) {349; CHECK-LABEL: @FtoItoFtoF_v3f16_v3s32_v3f32_v3f64(350; CHECK-NEXT:    [[I:%.*]] = fptosi <3 x half> [[F:%.*]] to <3 x i32>351; CHECK-NEXT:    [[R:%.*]] = sitofp <3 x i32> [[I]] to <3 x double>352; CHECK-NEXT:    ret <3 x double> [[R]]353;354  %i = fptosi <3 x half> %f to <3 x i32>355  %x = sitofp <3 x i32> %i to <3 x float>356  %r = fpext <3 x float> %x to <3 x double>357  ret <3 x double> %r358}359 360; Wider than double is ok.361 362define fp128 @FtoItoFtoF_f32_s64_f64_f128(float %f) {363; CHECK-LABEL: @FtoItoFtoF_f32_s64_f64_f128(364; CHECK-NEXT:    [[I:%.*]] = fptosi float [[F:%.*]] to i64365; CHECK-NEXT:    [[R:%.*]] = sitofp i64 [[I]] to fp128366; CHECK-NEXT:    ret fp128 [[R]]367;368  %i = fptosi float %f to i64369  %x = sitofp i64 %i to double370  %r = fpext double %x to fp128371  ret fp128 %r372}373 374; Target-specific type is ok.375 376define x86_fp80 @FtoItoFtoF_f64_u54_f64_f80(double %f) {377; CHECK-LABEL: @FtoItoFtoF_f64_u54_f64_f80(378; CHECK-NEXT:    [[I:%.*]] = fptoui double [[F:%.*]] to i54379; CHECK-NEXT:    [[R:%.*]] = uitofp i54 [[I]] to x86_fp80380; CHECK-NEXT:    ret x86_fp80 [[R]]381;382  %i = fptoui double %f to i54383  %x = uitofp i54 %i to double384  %r = fpext double %x to x86_fp80385  ret x86_fp80 %r386}387 388; Weird target-specific type is ok (not possible to extend *from* that type).389 390define ppc_fp128 @FtoItoFtoF_f64_u54_f64_p128(double %f) {391; CHECK-LABEL: @FtoItoFtoF_f64_u54_f64_p128(392; CHECK-NEXT:    [[I:%.*]] = fptoui double [[F:%.*]] to i54393; CHECK-NEXT:    [[R:%.*]] = uitofp i54 [[I]] to ppc_fp128394; CHECK-NEXT:    ret ppc_fp128 [[R]]395;396  %i = fptoui double %f to i54397  %x = uitofp i54 %i to double398  %r = fpext double %x to ppc_fp128399  ret ppc_fp128 %r400}401 402; Unsigned to signed is ok because signed int has smaller magnitude.403 404define double @FtoItoFtoF_f32_us32_f32_f64(float %f) {405; CHECK-LABEL: @FtoItoFtoF_f32_us32_f32_f64(406; CHECK-NEXT:    [[I:%.*]] = fptoui float [[F:%.*]] to i32407; CHECK-NEXT:    [[R:%.*]] = sitofp i32 [[I]] to double408; CHECK-NEXT:    ret double [[R]]409;410  %i = fptoui float %f to i32411  %x = sitofp i32 %i to float412  %r = fpext float %x to double413  ret double %r414}415 416; Negative test: consider -1.0417 418define double @FtoItoFtoF_f32_su32_f32_f64(float %f) {419; CHECK-LABEL: @FtoItoFtoF_f32_su32_f32_f64(420; CHECK-NEXT:    [[I:%.*]] = fptosi float [[F:%.*]] to i32421; CHECK-NEXT:    [[X:%.*]] = uitofp i32 [[I]] to float422; CHECK-NEXT:    [[R:%.*]] = fpext float [[X]] to double423; CHECK-NEXT:    ret double [[R]]424;425  %i = fptosi float %f to i32426  %x = uitofp i32 %i to float427  %r = fpext float %x to double428  ret double %r429}430 431define half @bf16_to_f32_to_f16(bfloat %a) nounwind {432; CHECK-LABEL: @bf16_to_f32_to_f16(433; CHECK-NEXT:    [[Y:%.*]] = fpext bfloat [[A:%.*]] to float434; CHECK-NEXT:    [[Z:%.*]] = fptrunc float [[Y]] to half435; CHECK-NEXT:    ret half [[Z]]436;437  %y = fpext bfloat %a to float438  %z = fptrunc float %y to half439  ret half %z440}441 442define bfloat @bf16_frem(bfloat %x) {443; CHECK-LABEL: @bf16_frem(444; CHECK-NEXT:    [[TMP1:%.*]] = frem bfloat [[X:%.*]], 0xR40C9445; CHECK-NEXT:    ret bfloat [[TMP1]]446;447  %t1 = fpext bfloat %x to float448  %t2 = frem float %t1, 6.281250e+00449  %t3 = fptrunc float %t2 to bfloat450  ret bfloat %t3451}452 453define <4 x bfloat> @v4bf16_frem_x_const(<4 x bfloat> %x) {454; CHECK-LABEL: @v4bf16_frem_x_const(455; CHECK-NEXT:    [[TMP1:%.*]] = frem <4 x bfloat> [[X:%.*]], splat (bfloat 0xR40C9)456; CHECK-NEXT:    ret <4 x bfloat> [[TMP1]]457;458  %t1 = fpext <4 x bfloat> %x to <4 x float>459  %t2 = frem <4 x float> %t1, splat(float 6.281250e+00)460  %t3 = fptrunc <4 x float> %t2 to <4 x bfloat>461  ret <4 x bfloat> %t3462}463 464define <4 x bfloat> @v4bf16_frem_const_x(<4 x bfloat> %x) {465; CHECK-LABEL: @v4bf16_frem_const_x(466; CHECK-NEXT:    [[TMP1:%.*]] = frem <4 x bfloat> splat (bfloat 0xR40C9), [[X:%.*]]467; CHECK-NEXT:    ret <4 x bfloat> [[TMP1]]468;469  %t1 = fpext <4 x bfloat> %x to <4 x float>470  %t2 = frem <4 x float> splat(float 6.281250e+00), %t1471  %t3 = fptrunc <4 x float> %t2 to <4 x bfloat>472  ret <4 x bfloat> %t3473}474 475define <4 x float> @v4f32_fadd(<4 x float> %a) {476; CHECK-LABEL: @v4f32_fadd(477; CHECK-NEXT:    [[TMP1:%.*]] = fadd <4 x float> [[A:%.*]], splat (float -1.000000e+00)478; CHECK-NEXT:    ret <4 x float> [[TMP1]]479;480  %2 = fpext <4 x float> %a to <4 x double>481  %4 = fadd <4 x double> %2, splat (double -1.000000e+00)482  %5 = fptrunc <4 x double> %4 to <4 x float>483  ret <4 x float> %5484}485 486define <4 x float> @v4f32_fadd_const_not_shrinkable(<4 x float> %a) {487; CHECK-LABEL: @v4f32_fadd_const_not_shrinkable(488; CHECK-NEXT:    [[TMP1:%.*]] = fpext <4 x float> [[A:%.*]] to <4 x double>489; CHECK-NEXT:    [[TMP2:%.*]] = fadd <4 x double> [[TMP1]], splat (double -1.000000e+100)490; CHECK-NEXT:    [[TMP3:%.*]] = fptrunc <4 x double> [[TMP2]] to <4 x float>491; CHECK-NEXT:    ret <4 x float> [[TMP3]]492;493  %2 = fpext <4 x float> %a to <4 x double>494  %4 = fadd <4 x double> %2, splat (double -1.000000e+100)495  %5 = fptrunc <4 x double> %4 to <4 x float>496  ret <4 x float> %5497}498