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