brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.7 KiB · 1b05f31 Raw
412 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -mtriple=s390x-unknown-linux -mcpu=z15 -passes=slp-vectorizer %s -S -o - \3; RUN:   | FileCheck %s4 5; Test vectorization and reassociation of fmin/fmax operations. Vectorization6; is more profitable if the loads are also vectorizable.7 8define double @fmin_double_4_nums_seq(ptr nocapture noundef readonly %x) {9; CHECK-LABEL: define double @fmin_double_4_nums_seq(10; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0:[0-9]+]] {11; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 412; CHECK-NEXT:    [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[TMP1]])13; CHECK-NEXT:    ret double [[TMP2]]14;15  %g1 = getelementptr inbounds double, ptr %x, i64 116  %g2 = getelementptr inbounds double, ptr %x, i64 217  %g3 = getelementptr inbounds double, ptr %x, i64 318  %t0 = load double, ptr %x, align 419  %t1 = load double, ptr %g1, align 420  %t2 = load double, ptr %g2, align 421  %t3 = load double, ptr %g3, align 422  %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0)23  %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1)24  %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2)25  ret double %m326}27 28define double @fmin_double_16_nums_nonseq(ptr nocapture noundef readonly %x) {29; CHECK-LABEL: define double @fmin_double_16_nums_nonseq(30; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {31; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 232; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 433; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 634; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 835; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1036; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1237; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1438; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1639; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1840; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2041; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2242; CHECK-NEXT:    [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2443; CHECK-NEXT:    [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2644; CHECK-NEXT:    [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2845; CHECK-NEXT:    [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3046; CHECK-NEXT:    [[T0:%.*]] = load double, ptr [[X]], align 447; CHECK-NEXT:    [[T1:%.*]] = load double, ptr [[G1]], align 448; CHECK-NEXT:    [[T2:%.*]] = load double, ptr [[G2]], align 449; CHECK-NEXT:    [[T3:%.*]] = load double, ptr [[G3]], align 450; CHECK-NEXT:    [[T4:%.*]] = load double, ptr [[G4]], align 451; CHECK-NEXT:    [[T5:%.*]] = load double, ptr [[G5]], align 452; CHECK-NEXT:    [[T6:%.*]] = load double, ptr [[G6]], align 453; CHECK-NEXT:    [[T7:%.*]] = load double, ptr [[G7]], align 454; CHECK-NEXT:    [[T8:%.*]] = load double, ptr [[G8]], align 455; CHECK-NEXT:    [[T9:%.*]] = load double, ptr [[G9]], align 456; CHECK-NEXT:    [[T10:%.*]] = load double, ptr [[G10]], align 457; CHECK-NEXT:    [[T11:%.*]] = load double, ptr [[G11]], align 458; CHECK-NEXT:    [[T12:%.*]] = load double, ptr [[G12]], align 459; CHECK-NEXT:    [[T13:%.*]] = load double, ptr [[G13]], align 460; CHECK-NEXT:    [[T14:%.*]] = load double, ptr [[G14]], align 461; CHECK-NEXT:    [[T15:%.*]] = load double, ptr [[G15]], align 462; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 063; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 164; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 265; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 366; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 467; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 568; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 669; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 770; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 871; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 972; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 1073; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 1174; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 1275; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 1376; CHECK-NEXT:    [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 1477; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 1578; CHECK-NEXT:    [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmin.v16f64(<16 x double> [[TMP16]])79; CHECK-NEXT:    ret double [[TMP17]]80;81  %g1 = getelementptr inbounds double, ptr %x, i64 282  %g2 = getelementptr inbounds double, ptr %x, i64 483  %g3 = getelementptr inbounds double, ptr %x, i64 684  %g4 = getelementptr inbounds double, ptr %x, i64 885  %g5 = getelementptr inbounds double, ptr %x, i64 1086  %g6 = getelementptr inbounds double, ptr %x, i64 1287  %g7 = getelementptr inbounds double, ptr %x, i64 1488  %g8 = getelementptr inbounds double, ptr %x, i64 1689  %g9 = getelementptr inbounds double, ptr %x, i64 1890  %g10 = getelementptr inbounds double, ptr %x, i64 2091  %g11 = getelementptr inbounds double, ptr %x, i64 2292  %g12 = getelementptr inbounds double, ptr %x, i64 2493  %g13 = getelementptr inbounds double, ptr %x, i64 2694  %g14 = getelementptr inbounds double, ptr %x, i64 2895  %g15 = getelementptr inbounds double, ptr %x, i64 3096  %t0 = load double, ptr %x, align 497  %t1 = load double, ptr %g1, align 498  %t2 = load double, ptr %g2, align 499  %t3 = load double, ptr %g3, align 4100  %t4 = load double, ptr %g4, align 4101  %t5 = load double, ptr %g5, align 4102  %t6 = load double, ptr %g6, align 4103  %t7 = load double, ptr %g7, align 4104  %t8 = load double, ptr %g8, align 4105  %t9 = load double, ptr %g9, align 4106  %t10 = load double, ptr %g10, align 4107  %t11 = load double, ptr %g11, align 4108  %t12 = load double, ptr %g12, align 4109  %t13 = load double, ptr %g13, align 4110  %t14 = load double, ptr %g14, align 4111  %t15 = load double, ptr %g15, align 4112  %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0)113  %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1)114  %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2)115  %m4 = tail call fast double @llvm.minnum.f64(double %t4, double %m3)116  %m5 = tail call fast double @llvm.minnum.f64(double %t5, double %m4)117  %m6 = tail call fast double @llvm.minnum.f64(double %t6, double %m5)118  %m7 = tail call fast double @llvm.minnum.f64(double %t7, double %m6)119  %m8 = tail call fast double @llvm.minnum.f64(double %t8, double %m7)120  %m9 = tail call fast double @llvm.minnum.f64(double %t9, double %m8)121  %m10 = tail call fast double @llvm.minnum.f64(double %t10, double %m9)122  %m11 = tail call fast double @llvm.minnum.f64(double %t11, double %m10)123  %m12 = tail call fast double @llvm.minnum.f64(double %t12, double %m11)124  %m13 = tail call fast double @llvm.minnum.f64(double %t13, double %m12)125  %m14 = tail call fast double @llvm.minnum.f64(double %t14, double %m13)126  %m15 = tail call fast double @llvm.minnum.f64(double %t15, double %m14)127  ret double %m15128}129 130define float @fmin_float_12_nums_nonseq(ptr nocapture noundef readonly %x) {131; CHECK-LABEL: define float @fmin_float_12_nums_nonseq(132; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {133; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2134; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4135; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6136; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8137; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10138; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12139; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14140; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16141; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18142; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20143; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22144; CHECK-NEXT:    [[T0:%.*]] = load float, ptr [[X]], align 4145; CHECK-NEXT:    [[T1:%.*]] = load float, ptr [[G1]], align 4146; CHECK-NEXT:    [[T2:%.*]] = load float, ptr [[G2]], align 4147; CHECK-NEXT:    [[T3:%.*]] = load float, ptr [[G3]], align 4148; CHECK-NEXT:    [[T4:%.*]] = load float, ptr [[G4]], align 4149; CHECK-NEXT:    [[T5:%.*]] = load float, ptr [[G5]], align 4150; CHECK-NEXT:    [[T6:%.*]] = load float, ptr [[G6]], align 4151; CHECK-NEXT:    [[T7:%.*]] = load float, ptr [[G7]], align 4152; CHECK-NEXT:    [[T8:%.*]] = load float, ptr [[G8]], align 4153; CHECK-NEXT:    [[T9:%.*]] = load float, ptr [[G9]], align 4154; CHECK-NEXT:    [[T10:%.*]] = load float, ptr [[G10]], align 4155; CHECK-NEXT:    [[T11:%.*]] = load float, ptr [[G11]], align 4156; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0157; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1158; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2159; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3160; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4161; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5162; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6163; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7164; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8165; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9166; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10167; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11168; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmin.v12f32(<12 x float> [[TMP12]])169; CHECK-NEXT:    ret float [[TMP13]]170;171  %g1 = getelementptr inbounds float, ptr %x, i64 2172  %g2 = getelementptr inbounds float, ptr %x, i64 4173  %g3 = getelementptr inbounds float, ptr %x, i64 6174  %g4 = getelementptr inbounds float, ptr %x, i64 8175  %g5 = getelementptr inbounds float, ptr %x, i64 10176  %g6 = getelementptr inbounds float, ptr %x, i64 12177  %g7 = getelementptr inbounds float, ptr %x, i64 14178  %g8 = getelementptr inbounds float, ptr %x, i64 16179  %g9 = getelementptr inbounds float, ptr %x, i64 18180  %g10 = getelementptr inbounds float, ptr %x, i64 20181  %g11 = getelementptr inbounds float, ptr %x, i64 22182  %t0 = load float, ptr %x, align 4183  %t1 = load float, ptr %g1, align 4184  %t2 = load float, ptr %g2, align 4185  %t3 = load float, ptr %g3, align 4186  %t4 = load float, ptr %g4, align 4187  %t5 = load float, ptr %g5, align 4188  %t6 = load float, ptr %g6, align 4189  %t7 = load float, ptr %g7, align 4190  %t8 = load float, ptr %g8, align 4191  %t9 = load float, ptr %g9, align 4192  %t10 = load float, ptr %g10, align 4193  %t11 = load float, ptr %g11, align 4194  %m1 = tail call fast float @llvm.minnum.f32(float %t1, float %t0)195  %m2 = tail call fast float @llvm.minnum.f32(float %t2, float %m1)196  %m3 = tail call fast float @llvm.minnum.f32(float %t3, float %m2)197  %m4 = tail call fast float @llvm.minnum.f32(float %t4, float %m3)198  %m5 = tail call fast float @llvm.minnum.f32(float %t5, float %m4)199  %m6 = tail call fast float @llvm.minnum.f32(float %t6, float %m5)200  %m7 = tail call fast float @llvm.minnum.f32(float %t7, float %m6)201  %m8 = tail call fast float @llvm.minnum.f32(float %t8, float %m7)202  %m9 = tail call fast float @llvm.minnum.f32(float %t9, float %m8)203  %m10 = tail call fast float @llvm.minnum.f32(float %t10, float %m9)204  %m11 = tail call fast float @llvm.minnum.f32(float %t11, float %m10)205  ret float %m11206}207 208define double @fmax_double_4_nums_seq(ptr nocapture noundef readonly %x) {209; CHECK-LABEL: define double @fmax_double_4_nums_seq(210; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {211; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 4212; CHECK-NEXT:    [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[TMP1]])213; CHECK-NEXT:    ret double [[TMP2]]214;215  %g1 = getelementptr inbounds double, ptr %x, i64 1216  %g2 = getelementptr inbounds double, ptr %x, i64 2217  %g3 = getelementptr inbounds double, ptr %x, i64 3218  %t0 = load double, ptr %x, align 4219  %t1 = load double, ptr %g1, align 4220  %t2 = load double, ptr %g2, align 4221  %t3 = load double, ptr %g3, align 4222  %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0)223  %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1)224  %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2)225  ret double %m3226}227 228define double @fmax_double_16_nums_nonseq(ptr nocapture noundef readonly %x) {229; CHECK-LABEL: define double @fmax_double_16_nums_nonseq(230; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {231; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2232; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4233; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6234; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 8235; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 10236; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 12237; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 14238; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 16239; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 18240; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 20241; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 22242; CHECK-NEXT:    [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 24243; CHECK-NEXT:    [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 26244; CHECK-NEXT:    [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 28245; CHECK-NEXT:    [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 30246; CHECK-NEXT:    [[T0:%.*]] = load double, ptr [[X]], align 4247; CHECK-NEXT:    [[T1:%.*]] = load double, ptr [[G1]], align 4248; CHECK-NEXT:    [[T2:%.*]] = load double, ptr [[G2]], align 4249; CHECK-NEXT:    [[T3:%.*]] = load double, ptr [[G3]], align 4250; CHECK-NEXT:    [[T4:%.*]] = load double, ptr [[G4]], align 4251; CHECK-NEXT:    [[T5:%.*]] = load double, ptr [[G5]], align 4252; CHECK-NEXT:    [[T6:%.*]] = load double, ptr [[G6]], align 4253; CHECK-NEXT:    [[T7:%.*]] = load double, ptr [[G7]], align 4254; CHECK-NEXT:    [[T8:%.*]] = load double, ptr [[G8]], align 4255; CHECK-NEXT:    [[T9:%.*]] = load double, ptr [[G9]], align 4256; CHECK-NEXT:    [[T10:%.*]] = load double, ptr [[G10]], align 4257; CHECK-NEXT:    [[T11:%.*]] = load double, ptr [[G11]], align 4258; CHECK-NEXT:    [[T12:%.*]] = load double, ptr [[G12]], align 4259; CHECK-NEXT:    [[T13:%.*]] = load double, ptr [[G13]], align 4260; CHECK-NEXT:    [[T14:%.*]] = load double, ptr [[G14]], align 4261; CHECK-NEXT:    [[T15:%.*]] = load double, ptr [[G15]], align 4262; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 0263; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 1264; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 2265; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 3266; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 4267; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 5268; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 6269; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 7270; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 8271; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 9272; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 10273; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 11274; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 12275; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 13276; CHECK-NEXT:    [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 14277; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 15278; CHECK-NEXT:    [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmax.v16f64(<16 x double> [[TMP16]])279; CHECK-NEXT:    ret double [[TMP17]]280;281  %g1 = getelementptr inbounds double, ptr %x, i64 2282  %g2 = getelementptr inbounds double, ptr %x, i64 4283  %g3 = getelementptr inbounds double, ptr %x, i64 6284  %g4 = getelementptr inbounds double, ptr %x, i64 8285  %g5 = getelementptr inbounds double, ptr %x, i64 10286  %g6 = getelementptr inbounds double, ptr %x, i64 12287  %g7 = getelementptr inbounds double, ptr %x, i64 14288  %g8 = getelementptr inbounds double, ptr %x, i64 16289  %g9 = getelementptr inbounds double, ptr %x, i64 18290  %g10 = getelementptr inbounds double, ptr %x, i64 20291  %g11 = getelementptr inbounds double, ptr %x, i64 22292  %g12 = getelementptr inbounds double, ptr %x, i64 24293  %g13 = getelementptr inbounds double, ptr %x, i64 26294  %g14 = getelementptr inbounds double, ptr %x, i64 28295  %g15 = getelementptr inbounds double, ptr %x, i64 30296  %t0 = load double, ptr %x, align 4297  %t1 = load double, ptr %g1, align 4298  %t2 = load double, ptr %g2, align 4299  %t3 = load double, ptr %g3, align 4300  %t4 = load double, ptr %g4, align 4301  %t5 = load double, ptr %g5, align 4302  %t6 = load double, ptr %g6, align 4303  %t7 = load double, ptr %g7, align 4304  %t8 = load double, ptr %g8, align 4305  %t9 = load double, ptr %g9, align 4306  %t10 = load double, ptr %g10, align 4307  %t11 = load double, ptr %g11, align 4308  %t12 = load double, ptr %g12, align 4309  %t13 = load double, ptr %g13, align 4310  %t14 = load double, ptr %g14, align 4311  %t15 = load double, ptr %g15, align 4312  %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0)313  %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1)314  %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2)315  %m4 = tail call fast double @llvm.maxnum.f64(double %t4, double %m3)316  %m5 = tail call fast double @llvm.maxnum.f64(double %t5, double %m4)317  %m6 = tail call fast double @llvm.maxnum.f64(double %t6, double %m5)318  %m7 = tail call fast double @llvm.maxnum.f64(double %t7, double %m6)319  %m8 = tail call fast double @llvm.maxnum.f64(double %t8, double %m7)320  %m9 = tail call fast double @llvm.maxnum.f64(double %t9, double %m8)321  %m10 = tail call fast double @llvm.maxnum.f64(double %t10, double %m9)322  %m11 = tail call fast double @llvm.maxnum.f64(double %t11, double %m10)323  %m12 = tail call fast double @llvm.maxnum.f64(double %t12, double %m11)324  %m13 = tail call fast double @llvm.maxnum.f64(double %t13, double %m12)325  %m14 = tail call fast double @llvm.maxnum.f64(double %t14, double %m13)326  %m15 = tail call fast double @llvm.maxnum.f64(double %t15, double %m14)327  ret double %m15328}329 330define float @fmax_float_12_nums_nonseq(ptr nocapture noundef readonly %x) {331; CHECK-LABEL: define float @fmax_float_12_nums_nonseq(332; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {333; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2334; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4335; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6336; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8337; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10338; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12339; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14340; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16341; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18342; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20343; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22344; CHECK-NEXT:    [[T0:%.*]] = load float, ptr [[X]], align 4345; CHECK-NEXT:    [[T1:%.*]] = load float, ptr [[G1]], align 4346; CHECK-NEXT:    [[T2:%.*]] = load float, ptr [[G2]], align 4347; CHECK-NEXT:    [[T3:%.*]] = load float, ptr [[G3]], align 4348; CHECK-NEXT:    [[T4:%.*]] = load float, ptr [[G4]], align 4349; CHECK-NEXT:    [[T5:%.*]] = load float, ptr [[G5]], align 4350; CHECK-NEXT:    [[T6:%.*]] = load float, ptr [[G6]], align 4351; CHECK-NEXT:    [[T7:%.*]] = load float, ptr [[G7]], align 4352; CHECK-NEXT:    [[T8:%.*]] = load float, ptr [[G8]], align 4353; CHECK-NEXT:    [[T9:%.*]] = load float, ptr [[G9]], align 4354; CHECK-NEXT:    [[T10:%.*]] = load float, ptr [[G10]], align 4355; CHECK-NEXT:    [[T11:%.*]] = load float, ptr [[G11]], align 4356; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0357; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1358; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2359; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3360; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4361; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5362; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6363; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7364; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8365; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9366; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10367; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11368; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmax.v12f32(<12 x float> [[TMP12]])369; CHECK-NEXT:    ret float [[TMP13]]370;371  %g1 = getelementptr inbounds float, ptr %x, i64 2372  %g2 = getelementptr inbounds float, ptr %x, i64 4373  %g3 = getelementptr inbounds float, ptr %x, i64 6374  %g4 = getelementptr inbounds float, ptr %x, i64 8375  %g5 = getelementptr inbounds float, ptr %x, i64 10376  %g6 = getelementptr inbounds float, ptr %x, i64 12377  %g7 = getelementptr inbounds float, ptr %x, i64 14378  %g8 = getelementptr inbounds float, ptr %x, i64 16379  %g9 = getelementptr inbounds float, ptr %x, i64 18380  %g10 = getelementptr inbounds float, ptr %x, i64 20381  %g11 = getelementptr inbounds float, ptr %x, i64 22382  %t0 = load float, ptr %x, align 4383  %t1 = load float, ptr %g1, align 4384  %t2 = load float, ptr %g2, align 4385  %t3 = load float, ptr %g3, align 4386  %t4 = load float, ptr %g4, align 4387  %t5 = load float, ptr %g5, align 4388  %t6 = load float, ptr %g6, align 4389  %t7 = load float, ptr %g7, align 4390  %t8 = load float, ptr %g8, align 4391  %t9 = load float, ptr %g9, align 4392  %t10 = load float, ptr %g10, align 4393  %t11 = load float, ptr %g11, align 4394  %m1 = tail call fast float @llvm.maxnum.f32(float %t1, float %t0)395  %m2 = tail call fast float @llvm.maxnum.f32(float %t2, float %m1)396  %m3 = tail call fast float @llvm.maxnum.f32(float %t3, float %m2)397  %m4 = tail call fast float @llvm.maxnum.f32(float %t4, float %m3)398  %m5 = tail call fast float @llvm.maxnum.f32(float %t5, float %m4)399  %m6 = tail call fast float @llvm.maxnum.f32(float %t6, float %m5)400  %m7 = tail call fast float @llvm.maxnum.f32(float %t7, float %m6)401  %m8 = tail call fast float @llvm.maxnum.f32(float %t8, float %m7)402  %m9 = tail call fast float @llvm.maxnum.f32(float %t9, float %m8)403  %m10 = tail call fast float @llvm.maxnum.f32(float %t10, float %m9)404  %m11 = tail call fast float @llvm.maxnum.f32(float %t11, float %m10)405  ret float %m11406}407 408declare float @llvm.minnum.f32(float, float)409declare double @llvm.minnum.f64(double, double)410declare float @llvm.maxnum.f32(float, float)411declare double @llvm.maxnum.f64(double, double)412