1866b9f43SDominik Steenken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2866b9f43SDominik Steenken; RUN: opt -mtriple=s390x-unknown-linux -mcpu=z15 -passes=slp-vectorizer %s -S -o - \ 3866b9f43SDominik Steenken; RUN: | FileCheck %s 4866b9f43SDominik Steenken 5866b9f43SDominik Steenken; Test vectorization and reassociation of fmin/fmax operations. Vectorization 6866b9f43SDominik Steenken; is more profitable if the loads are also vectorizable. 7866b9f43SDominik Steenken 8866b9f43SDominik Steenkendefine double @fmin_double_4_nums_seq(ptr nocapture noundef readonly %x) { 9866b9f43SDominik Steenken; CHECK-LABEL: define double @fmin_double_4_nums_seq( 10*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0:[0-9]+]] { 11866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 4 12866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[TMP1]]) 13866b9f43SDominik Steenken; CHECK-NEXT: ret double [[TMP2]] 14866b9f43SDominik Steenken; 15866b9f43SDominik Steenken %g1 = getelementptr inbounds double, ptr %x, i64 1 16866b9f43SDominik Steenken %g2 = getelementptr inbounds double, ptr %x, i64 2 17866b9f43SDominik Steenken %g3 = getelementptr inbounds double, ptr %x, i64 3 18866b9f43SDominik Steenken %t0 = load double, ptr %x, align 4 19866b9f43SDominik Steenken %t1 = load double, ptr %g1, align 4 20866b9f43SDominik Steenken %t2 = load double, ptr %g2, align 4 21866b9f43SDominik Steenken %t3 = load double, ptr %g3, align 4 22866b9f43SDominik Steenken %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0) 23866b9f43SDominik Steenken %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1) 24866b9f43SDominik Steenken %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2) 25866b9f43SDominik Steenken ret double %m3 26866b9f43SDominik Steenken} 27866b9f43SDominik Steenken 28866b9f43SDominik Steenkendefine double @fmin_double_16_nums_nonseq(ptr nocapture noundef readonly %x) { 29866b9f43SDominik Steenken; CHECK-LABEL: define double @fmin_double_16_nums_nonseq( 30*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] { 31866b9f43SDominik Steenken; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 32866b9f43SDominik Steenken; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 33866b9f43SDominik Steenken; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 34866b9f43SDominik Steenken; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 8 35866b9f43SDominik Steenken; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 10 36866b9f43SDominik Steenken; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 12 37866b9f43SDominik Steenken; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 14 38866b9f43SDominik Steenken; CHECK-NEXT: [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 16 39866b9f43SDominik Steenken; CHECK-NEXT: [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 18 40866b9f43SDominik Steenken; CHECK-NEXT: [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 20 41866b9f43SDominik Steenken; CHECK-NEXT: [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 22 42866b9f43SDominik Steenken; CHECK-NEXT: [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 24 43866b9f43SDominik Steenken; CHECK-NEXT: [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 26 44866b9f43SDominik Steenken; CHECK-NEXT: [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 28 45866b9f43SDominik Steenken; CHECK-NEXT: [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 30 46866b9f43SDominik Steenken; CHECK-NEXT: [[T0:%.*]] = load double, ptr [[X]], align 4 47866b9f43SDominik Steenken; CHECK-NEXT: [[T1:%.*]] = load double, ptr [[G1]], align 4 48866b9f43SDominik Steenken; CHECK-NEXT: [[T2:%.*]] = load double, ptr [[G2]], align 4 49866b9f43SDominik Steenken; CHECK-NEXT: [[T3:%.*]] = load double, ptr [[G3]], align 4 50866b9f43SDominik Steenken; CHECK-NEXT: [[T4:%.*]] = load double, ptr [[G4]], align 4 51866b9f43SDominik Steenken; CHECK-NEXT: [[T5:%.*]] = load double, ptr [[G5]], align 4 52866b9f43SDominik Steenken; CHECK-NEXT: [[T6:%.*]] = load double, ptr [[G6]], align 4 53866b9f43SDominik Steenken; CHECK-NEXT: [[T7:%.*]] = load double, ptr [[G7]], align 4 54866b9f43SDominik Steenken; CHECK-NEXT: [[T8:%.*]] = load double, ptr [[G8]], align 4 55866b9f43SDominik Steenken; CHECK-NEXT: [[T9:%.*]] = load double, ptr [[G9]], align 4 56866b9f43SDominik Steenken; CHECK-NEXT: [[T10:%.*]] = load double, ptr [[G10]], align 4 57866b9f43SDominik Steenken; CHECK-NEXT: [[T11:%.*]] = load double, ptr [[G11]], align 4 58866b9f43SDominik Steenken; CHECK-NEXT: [[T12:%.*]] = load double, ptr [[G12]], align 4 59866b9f43SDominik Steenken; CHECK-NEXT: [[T13:%.*]] = load double, ptr [[G13]], align 4 60866b9f43SDominik Steenken; CHECK-NEXT: [[T14:%.*]] = load double, ptr [[G14]], align 4 61866b9f43SDominik Steenken; CHECK-NEXT: [[T15:%.*]] = load double, ptr [[G15]], align 4 62866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 0 63866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 1 64866b9f43SDominik Steenken; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 2 65866b9f43SDominik Steenken; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 3 66866b9f43SDominik Steenken; CHECK-NEXT: [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 4 67866b9f43SDominik Steenken; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 5 68866b9f43SDominik Steenken; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 6 69866b9f43SDominik Steenken; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 7 70866b9f43SDominik Steenken; CHECK-NEXT: [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 8 71866b9f43SDominik Steenken; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 9 72866b9f43SDominik Steenken; CHECK-NEXT: [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 10 73866b9f43SDominik Steenken; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 11 74866b9f43SDominik Steenken; CHECK-NEXT: [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 12 75866b9f43SDominik Steenken; CHECK-NEXT: [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 13 76866b9f43SDominik Steenken; CHECK-NEXT: [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 14 77866b9f43SDominik Steenken; CHECK-NEXT: [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 15 78866b9f43SDominik Steenken; CHECK-NEXT: [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmin.v16f64(<16 x double> [[TMP16]]) 79866b9f43SDominik Steenken; CHECK-NEXT: ret double [[TMP17]] 80866b9f43SDominik Steenken; 81866b9f43SDominik Steenken %g1 = getelementptr inbounds double, ptr %x, i64 2 82866b9f43SDominik Steenken %g2 = getelementptr inbounds double, ptr %x, i64 4 83866b9f43SDominik Steenken %g3 = getelementptr inbounds double, ptr %x, i64 6 84866b9f43SDominik Steenken %g4 = getelementptr inbounds double, ptr %x, i64 8 85866b9f43SDominik Steenken %g5 = getelementptr inbounds double, ptr %x, i64 10 86866b9f43SDominik Steenken %g6 = getelementptr inbounds double, ptr %x, i64 12 87866b9f43SDominik Steenken %g7 = getelementptr inbounds double, ptr %x, i64 14 88866b9f43SDominik Steenken %g8 = getelementptr inbounds double, ptr %x, i64 16 89866b9f43SDominik Steenken %g9 = getelementptr inbounds double, ptr %x, i64 18 90866b9f43SDominik Steenken %g10 = getelementptr inbounds double, ptr %x, i64 20 91866b9f43SDominik Steenken %g11 = getelementptr inbounds double, ptr %x, i64 22 92866b9f43SDominik Steenken %g12 = getelementptr inbounds double, ptr %x, i64 24 93866b9f43SDominik Steenken %g13 = getelementptr inbounds double, ptr %x, i64 26 94866b9f43SDominik Steenken %g14 = getelementptr inbounds double, ptr %x, i64 28 95866b9f43SDominik Steenken %g15 = getelementptr inbounds double, ptr %x, i64 30 96866b9f43SDominik Steenken %t0 = load double, ptr %x, align 4 97866b9f43SDominik Steenken %t1 = load double, ptr %g1, align 4 98866b9f43SDominik Steenken %t2 = load double, ptr %g2, align 4 99866b9f43SDominik Steenken %t3 = load double, ptr %g3, align 4 100866b9f43SDominik Steenken %t4 = load double, ptr %g4, align 4 101866b9f43SDominik Steenken %t5 = load double, ptr %g5, align 4 102866b9f43SDominik Steenken %t6 = load double, ptr %g6, align 4 103866b9f43SDominik Steenken %t7 = load double, ptr %g7, align 4 104866b9f43SDominik Steenken %t8 = load double, ptr %g8, align 4 105866b9f43SDominik Steenken %t9 = load double, ptr %g9, align 4 106866b9f43SDominik Steenken %t10 = load double, ptr %g10, align 4 107866b9f43SDominik Steenken %t11 = load double, ptr %g11, align 4 108866b9f43SDominik Steenken %t12 = load double, ptr %g12, align 4 109866b9f43SDominik Steenken %t13 = load double, ptr %g13, align 4 110866b9f43SDominik Steenken %t14 = load double, ptr %g14, align 4 111866b9f43SDominik Steenken %t15 = load double, ptr %g15, align 4 112866b9f43SDominik Steenken %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0) 113866b9f43SDominik Steenken %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1) 114866b9f43SDominik Steenken %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2) 115866b9f43SDominik Steenken %m4 = tail call fast double @llvm.minnum.f64(double %t4, double %m3) 116866b9f43SDominik Steenken %m5 = tail call fast double @llvm.minnum.f64(double %t5, double %m4) 117866b9f43SDominik Steenken %m6 = tail call fast double @llvm.minnum.f64(double %t6, double %m5) 118866b9f43SDominik Steenken %m7 = tail call fast double @llvm.minnum.f64(double %t7, double %m6) 119866b9f43SDominik Steenken %m8 = tail call fast double @llvm.minnum.f64(double %t8, double %m7) 120866b9f43SDominik Steenken %m9 = tail call fast double @llvm.minnum.f64(double %t9, double %m8) 121866b9f43SDominik Steenken %m10 = tail call fast double @llvm.minnum.f64(double %t10, double %m9) 122866b9f43SDominik Steenken %m11 = tail call fast double @llvm.minnum.f64(double %t11, double %m10) 123866b9f43SDominik Steenken %m12 = tail call fast double @llvm.minnum.f64(double %t12, double %m11) 124866b9f43SDominik Steenken %m13 = tail call fast double @llvm.minnum.f64(double %t13, double %m12) 125866b9f43SDominik Steenken %m14 = tail call fast double @llvm.minnum.f64(double %t14, double %m13) 126866b9f43SDominik Steenken %m15 = tail call fast double @llvm.minnum.f64(double %t15, double %m14) 127866b9f43SDominik Steenken ret double %m15 128866b9f43SDominik Steenken} 129866b9f43SDominik Steenken 130866b9f43SDominik Steenkendefine float @fmin_float_12_nums_nonseq(ptr nocapture noundef readonly %x) { 131866b9f43SDominik Steenken; CHECK-LABEL: define float @fmin_float_12_nums_nonseq( 132*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] { 133866b9f43SDominik Steenken; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2 134866b9f43SDominik Steenken; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4 135866b9f43SDominik Steenken; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6 136866b9f43SDominik Steenken; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8 137866b9f43SDominik Steenken; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10 138866b9f43SDominik Steenken; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12 139866b9f43SDominik Steenken; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14 140866b9f43SDominik Steenken; CHECK-NEXT: [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16 141866b9f43SDominik Steenken; CHECK-NEXT: [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18 142866b9f43SDominik Steenken; CHECK-NEXT: [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20 143866b9f43SDominik Steenken; CHECK-NEXT: [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22 144866b9f43SDominik Steenken; CHECK-NEXT: [[T0:%.*]] = load float, ptr [[X]], align 4 145866b9f43SDominik Steenken; CHECK-NEXT: [[T1:%.*]] = load float, ptr [[G1]], align 4 146866b9f43SDominik Steenken; CHECK-NEXT: [[T2:%.*]] = load float, ptr [[G2]], align 4 147866b9f43SDominik Steenken; CHECK-NEXT: [[T3:%.*]] = load float, ptr [[G3]], align 4 148866b9f43SDominik Steenken; CHECK-NEXT: [[T4:%.*]] = load float, ptr [[G4]], align 4 149866b9f43SDominik Steenken; CHECK-NEXT: [[T5:%.*]] = load float, ptr [[G5]], align 4 150866b9f43SDominik Steenken; CHECK-NEXT: [[T6:%.*]] = load float, ptr [[G6]], align 4 151866b9f43SDominik Steenken; CHECK-NEXT: [[T7:%.*]] = load float, ptr [[G7]], align 4 152866b9f43SDominik Steenken; CHECK-NEXT: [[T8:%.*]] = load float, ptr [[G8]], align 4 153866b9f43SDominik Steenken; CHECK-NEXT: [[T9:%.*]] = load float, ptr [[G9]], align 4 154866b9f43SDominik Steenken; CHECK-NEXT: [[T10:%.*]] = load float, ptr [[G10]], align 4 155866b9f43SDominik Steenken; CHECK-NEXT: [[T11:%.*]] = load float, ptr [[G11]], align 4 156866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0 157866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1 158866b9f43SDominik Steenken; CHECK-NEXT: [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2 159866b9f43SDominik Steenken; CHECK-NEXT: [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3 160866b9f43SDominik Steenken; CHECK-NEXT: [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4 161866b9f43SDominik Steenken; CHECK-NEXT: [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5 162866b9f43SDominik Steenken; CHECK-NEXT: [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6 163866b9f43SDominik Steenken; CHECK-NEXT: [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7 164866b9f43SDominik Steenken; CHECK-NEXT: [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8 165866b9f43SDominik Steenken; CHECK-NEXT: [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9 166866b9f43SDominik Steenken; CHECK-NEXT: [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10 167866b9f43SDominik Steenken; CHECK-NEXT: [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11 168866b9f43SDominik Steenken; CHECK-NEXT: [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmin.v12f32(<12 x float> [[TMP12]]) 169866b9f43SDominik Steenken; CHECK-NEXT: ret float [[TMP13]] 170866b9f43SDominik Steenken; 171866b9f43SDominik Steenken %g1 = getelementptr inbounds float, ptr %x, i64 2 172866b9f43SDominik Steenken %g2 = getelementptr inbounds float, ptr %x, i64 4 173866b9f43SDominik Steenken %g3 = getelementptr inbounds float, ptr %x, i64 6 174866b9f43SDominik Steenken %g4 = getelementptr inbounds float, ptr %x, i64 8 175866b9f43SDominik Steenken %g5 = getelementptr inbounds float, ptr %x, i64 10 176866b9f43SDominik Steenken %g6 = getelementptr inbounds float, ptr %x, i64 12 177866b9f43SDominik Steenken %g7 = getelementptr inbounds float, ptr %x, i64 14 178866b9f43SDominik Steenken %g8 = getelementptr inbounds float, ptr %x, i64 16 179866b9f43SDominik Steenken %g9 = getelementptr inbounds float, ptr %x, i64 18 180866b9f43SDominik Steenken %g10 = getelementptr inbounds float, ptr %x, i64 20 181866b9f43SDominik Steenken %g11 = getelementptr inbounds float, ptr %x, i64 22 182866b9f43SDominik Steenken %t0 = load float, ptr %x, align 4 183866b9f43SDominik Steenken %t1 = load float, ptr %g1, align 4 184866b9f43SDominik Steenken %t2 = load float, ptr %g2, align 4 185866b9f43SDominik Steenken %t3 = load float, ptr %g3, align 4 186866b9f43SDominik Steenken %t4 = load float, ptr %g4, align 4 187866b9f43SDominik Steenken %t5 = load float, ptr %g5, align 4 188866b9f43SDominik Steenken %t6 = load float, ptr %g6, align 4 189866b9f43SDominik Steenken %t7 = load float, ptr %g7, align 4 190866b9f43SDominik Steenken %t8 = load float, ptr %g8, align 4 191866b9f43SDominik Steenken %t9 = load float, ptr %g9, align 4 192866b9f43SDominik Steenken %t10 = load float, ptr %g10, align 4 193866b9f43SDominik Steenken %t11 = load float, ptr %g11, align 4 194866b9f43SDominik Steenken %m1 = tail call fast float @llvm.minnum.f32(float %t1, float %t0) 195866b9f43SDominik Steenken %m2 = tail call fast float @llvm.minnum.f32(float %t2, float %m1) 196866b9f43SDominik Steenken %m3 = tail call fast float @llvm.minnum.f32(float %t3, float %m2) 197866b9f43SDominik Steenken %m4 = tail call fast float @llvm.minnum.f32(float %t4, float %m3) 198866b9f43SDominik Steenken %m5 = tail call fast float @llvm.minnum.f32(float %t5, float %m4) 199866b9f43SDominik Steenken %m6 = tail call fast float @llvm.minnum.f32(float %t6, float %m5) 200866b9f43SDominik Steenken %m7 = tail call fast float @llvm.minnum.f32(float %t7, float %m6) 201866b9f43SDominik Steenken %m8 = tail call fast float @llvm.minnum.f32(float %t8, float %m7) 202866b9f43SDominik Steenken %m9 = tail call fast float @llvm.minnum.f32(float %t9, float %m8) 203866b9f43SDominik Steenken %m10 = tail call fast float @llvm.minnum.f32(float %t10, float %m9) 204866b9f43SDominik Steenken %m11 = tail call fast float @llvm.minnum.f32(float %t11, float %m10) 205866b9f43SDominik Steenken ret float %m11 206866b9f43SDominik Steenken} 207866b9f43SDominik Steenken 208866b9f43SDominik Steenkendefine double @fmax_double_4_nums_seq(ptr nocapture noundef readonly %x) { 209866b9f43SDominik Steenken; CHECK-LABEL: define double @fmax_double_4_nums_seq( 210*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] { 211866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 4 212866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[TMP1]]) 213866b9f43SDominik Steenken; CHECK-NEXT: ret double [[TMP2]] 214866b9f43SDominik Steenken; 215866b9f43SDominik Steenken %g1 = getelementptr inbounds double, ptr %x, i64 1 216866b9f43SDominik Steenken %g2 = getelementptr inbounds double, ptr %x, i64 2 217866b9f43SDominik Steenken %g3 = getelementptr inbounds double, ptr %x, i64 3 218866b9f43SDominik Steenken %t0 = load double, ptr %x, align 4 219866b9f43SDominik Steenken %t1 = load double, ptr %g1, align 4 220866b9f43SDominik Steenken %t2 = load double, ptr %g2, align 4 221866b9f43SDominik Steenken %t3 = load double, ptr %g3, align 4 222866b9f43SDominik Steenken %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0) 223866b9f43SDominik Steenken %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1) 224866b9f43SDominik Steenken %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2) 225866b9f43SDominik Steenken ret double %m3 226866b9f43SDominik Steenken} 227866b9f43SDominik Steenken 228866b9f43SDominik Steenkendefine double @fmax_double_16_nums_nonseq(ptr nocapture noundef readonly %x) { 229866b9f43SDominik Steenken; CHECK-LABEL: define double @fmax_double_16_nums_nonseq( 230*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] { 231866b9f43SDominik Steenken; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2 232866b9f43SDominik Steenken; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4 233866b9f43SDominik Steenken; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6 234866b9f43SDominik Steenken; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 8 235866b9f43SDominik Steenken; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 10 236866b9f43SDominik Steenken; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 12 237866b9f43SDominik Steenken; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 14 238866b9f43SDominik Steenken; CHECK-NEXT: [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 16 239866b9f43SDominik Steenken; CHECK-NEXT: [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 18 240866b9f43SDominik Steenken; CHECK-NEXT: [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 20 241866b9f43SDominik Steenken; CHECK-NEXT: [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 22 242866b9f43SDominik Steenken; CHECK-NEXT: [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 24 243866b9f43SDominik Steenken; CHECK-NEXT: [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 26 244866b9f43SDominik Steenken; CHECK-NEXT: [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 28 245866b9f43SDominik Steenken; CHECK-NEXT: [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 30 246866b9f43SDominik Steenken; CHECK-NEXT: [[T0:%.*]] = load double, ptr [[X]], align 4 247866b9f43SDominik Steenken; CHECK-NEXT: [[T1:%.*]] = load double, ptr [[G1]], align 4 248866b9f43SDominik Steenken; CHECK-NEXT: [[T2:%.*]] = load double, ptr [[G2]], align 4 249866b9f43SDominik Steenken; CHECK-NEXT: [[T3:%.*]] = load double, ptr [[G3]], align 4 250866b9f43SDominik Steenken; CHECK-NEXT: [[T4:%.*]] = load double, ptr [[G4]], align 4 251866b9f43SDominik Steenken; CHECK-NEXT: [[T5:%.*]] = load double, ptr [[G5]], align 4 252866b9f43SDominik Steenken; CHECK-NEXT: [[T6:%.*]] = load double, ptr [[G6]], align 4 253866b9f43SDominik Steenken; CHECK-NEXT: [[T7:%.*]] = load double, ptr [[G7]], align 4 254866b9f43SDominik Steenken; CHECK-NEXT: [[T8:%.*]] = load double, ptr [[G8]], align 4 255866b9f43SDominik Steenken; CHECK-NEXT: [[T9:%.*]] = load double, ptr [[G9]], align 4 256866b9f43SDominik Steenken; CHECK-NEXT: [[T10:%.*]] = load double, ptr [[G10]], align 4 257866b9f43SDominik Steenken; CHECK-NEXT: [[T11:%.*]] = load double, ptr [[G11]], align 4 258866b9f43SDominik Steenken; CHECK-NEXT: [[T12:%.*]] = load double, ptr [[G12]], align 4 259866b9f43SDominik Steenken; CHECK-NEXT: [[T13:%.*]] = load double, ptr [[G13]], align 4 260866b9f43SDominik Steenken; CHECK-NEXT: [[T14:%.*]] = load double, ptr [[G14]], align 4 261866b9f43SDominik Steenken; CHECK-NEXT: [[T15:%.*]] = load double, ptr [[G15]], align 4 262866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 0 263866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 1 264866b9f43SDominik Steenken; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 2 265866b9f43SDominik Steenken; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 3 266866b9f43SDominik Steenken; CHECK-NEXT: [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 4 267866b9f43SDominik Steenken; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 5 268866b9f43SDominik Steenken; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 6 269866b9f43SDominik Steenken; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 7 270866b9f43SDominik Steenken; CHECK-NEXT: [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 8 271866b9f43SDominik Steenken; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 9 272866b9f43SDominik Steenken; CHECK-NEXT: [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 10 273866b9f43SDominik Steenken; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 11 274866b9f43SDominik Steenken; CHECK-NEXT: [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 12 275866b9f43SDominik Steenken; CHECK-NEXT: [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 13 276866b9f43SDominik Steenken; CHECK-NEXT: [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 14 277866b9f43SDominik Steenken; CHECK-NEXT: [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 15 278866b9f43SDominik Steenken; CHECK-NEXT: [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmax.v16f64(<16 x double> [[TMP16]]) 279866b9f43SDominik Steenken; CHECK-NEXT: ret double [[TMP17]] 280866b9f43SDominik Steenken; 281866b9f43SDominik Steenken %g1 = getelementptr inbounds double, ptr %x, i64 2 282866b9f43SDominik Steenken %g2 = getelementptr inbounds double, ptr %x, i64 4 283866b9f43SDominik Steenken %g3 = getelementptr inbounds double, ptr %x, i64 6 284866b9f43SDominik Steenken %g4 = getelementptr inbounds double, ptr %x, i64 8 285866b9f43SDominik Steenken %g5 = getelementptr inbounds double, ptr %x, i64 10 286866b9f43SDominik Steenken %g6 = getelementptr inbounds double, ptr %x, i64 12 287866b9f43SDominik Steenken %g7 = getelementptr inbounds double, ptr %x, i64 14 288866b9f43SDominik Steenken %g8 = getelementptr inbounds double, ptr %x, i64 16 289866b9f43SDominik Steenken %g9 = getelementptr inbounds double, ptr %x, i64 18 290866b9f43SDominik Steenken %g10 = getelementptr inbounds double, ptr %x, i64 20 291866b9f43SDominik Steenken %g11 = getelementptr inbounds double, ptr %x, i64 22 292866b9f43SDominik Steenken %g12 = getelementptr inbounds double, ptr %x, i64 24 293866b9f43SDominik Steenken %g13 = getelementptr inbounds double, ptr %x, i64 26 294866b9f43SDominik Steenken %g14 = getelementptr inbounds double, ptr %x, i64 28 295866b9f43SDominik Steenken %g15 = getelementptr inbounds double, ptr %x, i64 30 296866b9f43SDominik Steenken %t0 = load double, ptr %x, align 4 297866b9f43SDominik Steenken %t1 = load double, ptr %g1, align 4 298866b9f43SDominik Steenken %t2 = load double, ptr %g2, align 4 299866b9f43SDominik Steenken %t3 = load double, ptr %g3, align 4 300866b9f43SDominik Steenken %t4 = load double, ptr %g4, align 4 301866b9f43SDominik Steenken %t5 = load double, ptr %g5, align 4 302866b9f43SDominik Steenken %t6 = load double, ptr %g6, align 4 303866b9f43SDominik Steenken %t7 = load double, ptr %g7, align 4 304866b9f43SDominik Steenken %t8 = load double, ptr %g8, align 4 305866b9f43SDominik Steenken %t9 = load double, ptr %g9, align 4 306866b9f43SDominik Steenken %t10 = load double, ptr %g10, align 4 307866b9f43SDominik Steenken %t11 = load double, ptr %g11, align 4 308866b9f43SDominik Steenken %t12 = load double, ptr %g12, align 4 309866b9f43SDominik Steenken %t13 = load double, ptr %g13, align 4 310866b9f43SDominik Steenken %t14 = load double, ptr %g14, align 4 311866b9f43SDominik Steenken %t15 = load double, ptr %g15, align 4 312866b9f43SDominik Steenken %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0) 313866b9f43SDominik Steenken %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1) 314866b9f43SDominik Steenken %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2) 315866b9f43SDominik Steenken %m4 = tail call fast double @llvm.maxnum.f64(double %t4, double %m3) 316866b9f43SDominik Steenken %m5 = tail call fast double @llvm.maxnum.f64(double %t5, double %m4) 317866b9f43SDominik Steenken %m6 = tail call fast double @llvm.maxnum.f64(double %t6, double %m5) 318866b9f43SDominik Steenken %m7 = tail call fast double @llvm.maxnum.f64(double %t7, double %m6) 319866b9f43SDominik Steenken %m8 = tail call fast double @llvm.maxnum.f64(double %t8, double %m7) 320866b9f43SDominik Steenken %m9 = tail call fast double @llvm.maxnum.f64(double %t9, double %m8) 321866b9f43SDominik Steenken %m10 = tail call fast double @llvm.maxnum.f64(double %t10, double %m9) 322866b9f43SDominik Steenken %m11 = tail call fast double @llvm.maxnum.f64(double %t11, double %m10) 323866b9f43SDominik Steenken %m12 = tail call fast double @llvm.maxnum.f64(double %t12, double %m11) 324866b9f43SDominik Steenken %m13 = tail call fast double @llvm.maxnum.f64(double %t13, double %m12) 325866b9f43SDominik Steenken %m14 = tail call fast double @llvm.maxnum.f64(double %t14, double %m13) 326866b9f43SDominik Steenken %m15 = tail call fast double @llvm.maxnum.f64(double %t15, double %m14) 327866b9f43SDominik Steenken ret double %m15 328866b9f43SDominik Steenken} 329866b9f43SDominik Steenken 330866b9f43SDominik Steenkendefine float @fmax_float_12_nums_nonseq(ptr nocapture noundef readonly %x) { 331866b9f43SDominik Steenken; CHECK-LABEL: define float @fmax_float_12_nums_nonseq( 332*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] { 333866b9f43SDominik Steenken; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2 334866b9f43SDominik Steenken; CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4 335866b9f43SDominik Steenken; CHECK-NEXT: [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6 336866b9f43SDominik Steenken; CHECK-NEXT: [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8 337866b9f43SDominik Steenken; CHECK-NEXT: [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10 338866b9f43SDominik Steenken; CHECK-NEXT: [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12 339866b9f43SDominik Steenken; CHECK-NEXT: [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14 340866b9f43SDominik Steenken; CHECK-NEXT: [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16 341866b9f43SDominik Steenken; CHECK-NEXT: [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18 342866b9f43SDominik Steenken; CHECK-NEXT: [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20 343866b9f43SDominik Steenken; CHECK-NEXT: [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22 344866b9f43SDominik Steenken; CHECK-NEXT: [[T0:%.*]] = load float, ptr [[X]], align 4 345866b9f43SDominik Steenken; CHECK-NEXT: [[T1:%.*]] = load float, ptr [[G1]], align 4 346866b9f43SDominik Steenken; CHECK-NEXT: [[T2:%.*]] = load float, ptr [[G2]], align 4 347866b9f43SDominik Steenken; CHECK-NEXT: [[T3:%.*]] = load float, ptr [[G3]], align 4 348866b9f43SDominik Steenken; CHECK-NEXT: [[T4:%.*]] = load float, ptr [[G4]], align 4 349866b9f43SDominik Steenken; CHECK-NEXT: [[T5:%.*]] = load float, ptr [[G5]], align 4 350866b9f43SDominik Steenken; CHECK-NEXT: [[T6:%.*]] = load float, ptr [[G6]], align 4 351866b9f43SDominik Steenken; CHECK-NEXT: [[T7:%.*]] = load float, ptr [[G7]], align 4 352866b9f43SDominik Steenken; CHECK-NEXT: [[T8:%.*]] = load float, ptr [[G8]], align 4 353866b9f43SDominik Steenken; CHECK-NEXT: [[T9:%.*]] = load float, ptr [[G9]], align 4 354866b9f43SDominik Steenken; CHECK-NEXT: [[T10:%.*]] = load float, ptr [[G10]], align 4 355866b9f43SDominik Steenken; CHECK-NEXT: [[T11:%.*]] = load float, ptr [[G11]], align 4 356866b9f43SDominik Steenken; CHECK-NEXT: [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0 357866b9f43SDominik Steenken; CHECK-NEXT: [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1 358866b9f43SDominik Steenken; CHECK-NEXT: [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2 359866b9f43SDominik Steenken; CHECK-NEXT: [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3 360866b9f43SDominik Steenken; CHECK-NEXT: [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4 361866b9f43SDominik Steenken; CHECK-NEXT: [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5 362866b9f43SDominik Steenken; CHECK-NEXT: [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6 363866b9f43SDominik Steenken; CHECK-NEXT: [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7 364866b9f43SDominik Steenken; CHECK-NEXT: [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8 365866b9f43SDominik Steenken; CHECK-NEXT: [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9 366866b9f43SDominik Steenken; CHECK-NEXT: [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10 367866b9f43SDominik Steenken; CHECK-NEXT: [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11 368866b9f43SDominik Steenken; CHECK-NEXT: [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmax.v12f32(<12 x float> [[TMP12]]) 369866b9f43SDominik Steenken; CHECK-NEXT: ret float [[TMP13]] 370866b9f43SDominik Steenken; 371866b9f43SDominik Steenken %g1 = getelementptr inbounds float, ptr %x, i64 2 372866b9f43SDominik Steenken %g2 = getelementptr inbounds float, ptr %x, i64 4 373866b9f43SDominik Steenken %g3 = getelementptr inbounds float, ptr %x, i64 6 374866b9f43SDominik Steenken %g4 = getelementptr inbounds float, ptr %x, i64 8 375866b9f43SDominik Steenken %g5 = getelementptr inbounds float, ptr %x, i64 10 376866b9f43SDominik Steenken %g6 = getelementptr inbounds float, ptr %x, i64 12 377866b9f43SDominik Steenken %g7 = getelementptr inbounds float, ptr %x, i64 14 378866b9f43SDominik Steenken %g8 = getelementptr inbounds float, ptr %x, i64 16 379866b9f43SDominik Steenken %g9 = getelementptr inbounds float, ptr %x, i64 18 380866b9f43SDominik Steenken %g10 = getelementptr inbounds float, ptr %x, i64 20 381866b9f43SDominik Steenken %g11 = getelementptr inbounds float, ptr %x, i64 22 382866b9f43SDominik Steenken %t0 = load float, ptr %x, align 4 383866b9f43SDominik Steenken %t1 = load float, ptr %g1, align 4 384866b9f43SDominik Steenken %t2 = load float, ptr %g2, align 4 385866b9f43SDominik Steenken %t3 = load float, ptr %g3, align 4 386866b9f43SDominik Steenken %t4 = load float, ptr %g4, align 4 387866b9f43SDominik Steenken %t5 = load float, ptr %g5, align 4 388866b9f43SDominik Steenken %t6 = load float, ptr %g6, align 4 389866b9f43SDominik Steenken %t7 = load float, ptr %g7, align 4 390866b9f43SDominik Steenken %t8 = load float, ptr %g8, align 4 391866b9f43SDominik Steenken %t9 = load float, ptr %g9, align 4 392866b9f43SDominik Steenken %t10 = load float, ptr %g10, align 4 393866b9f43SDominik Steenken %t11 = load float, ptr %g11, align 4 394866b9f43SDominik Steenken %m1 = tail call fast float @llvm.maxnum.f32(float %t1, float %t0) 395866b9f43SDominik Steenken %m2 = tail call fast float @llvm.maxnum.f32(float %t2, float %m1) 396866b9f43SDominik Steenken %m3 = tail call fast float @llvm.maxnum.f32(float %t3, float %m2) 397866b9f43SDominik Steenken %m4 = tail call fast float @llvm.maxnum.f32(float %t4, float %m3) 398866b9f43SDominik Steenken %m5 = tail call fast float @llvm.maxnum.f32(float %t5, float %m4) 399866b9f43SDominik Steenken %m6 = tail call fast float @llvm.maxnum.f32(float %t6, float %m5) 400866b9f43SDominik Steenken %m7 = tail call fast float @llvm.maxnum.f32(float %t7, float %m6) 401866b9f43SDominik Steenken %m8 = tail call fast float @llvm.maxnum.f32(float %t8, float %m7) 402866b9f43SDominik Steenken %m9 = tail call fast float @llvm.maxnum.f32(float %t9, float %m8) 403866b9f43SDominik Steenken %m10 = tail call fast float @llvm.maxnum.f32(float %t10, float %m9) 404866b9f43SDominik Steenken %m11 = tail call fast float @llvm.maxnum.f32(float %t11, float %m10) 405866b9f43SDominik Steenken ret float %m11 406866b9f43SDominik Steenken} 407866b9f43SDominik Steenken 408866b9f43SDominik Steenkendeclare float @llvm.minnum.f32(float, float) 409866b9f43SDominik Steenkendeclare double @llvm.minnum.f64(double, double) 410866b9f43SDominik Steenkendeclare float @llvm.maxnum.f32(float, float) 411866b9f43SDominik Steenkendeclare double @llvm.maxnum.f64(double, double) 412