1*0ad6be19SJonas Paulsson; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2aba39c39SJonas Paulsson; RUN: opt < %s -mtriple=s390x-unknown-linux -mcpu=z16 -S -passes=slp-vectorizer \ 3aba39c39SJonas Paulsson; RUN: -pass-remarks-output=%t | FileCheck %s 4aba39c39SJonas Paulsson; RUN: cat %t | FileCheck -check-prefix=REMARK %s 5aba39c39SJonas Paulsson; 6aba39c39SJonas Paulsson; Test functions that (at least currently) only gets vectorized if the 7aba39c39SJonas Paulsson; insertion cost for an element load is counted as free. 8aba39c39SJonas Paulsson 9*0ad6be19SJonas Paulssondeclare double @llvm.fmuladd.f64(double, double, double) 10*0ad6be19SJonas Paulsson 11aba39c39SJonas Paulsson; This function needs the free element load to be recognized in SLP 12aba39c39SJonas Paulsson; getGatherCost(). 13*0ad6be19SJonas Paulssondefine void @fun0(ptr %0, double %1) { 14aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun0( 15*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]], double [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] { 16*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP3:%.*]] = load double, ptr [[TMP0]], align 8 17*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x double> poison, double [[TMP1]], i32 0 18*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x double> [[TMP4]], double [[TMP3]], i32 1 19*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP6:%.*]] = fmul <2 x double> [[TMP5]], splat (double 2.000000e+00) 20*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP7:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP6]], <2 x double> zeroinitializer) 21*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP8:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP6]], <2 x double> [[TMP7]]) 22*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP9:%.*]] = call <2 x double> @llvm.sqrt.v2f64(<2 x double> [[TMP8]]) 23*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x double> [[TMP9]], i32 0 24*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP11:%.*]] = extractelement <2 x double> [[TMP9]], i32 1 25*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP12:%.*]] = fadd double [[TMP10]], [[TMP11]] 26*0ad6be19SJonas Paulsson; CHECK-NEXT: store double [[TMP12]], ptr [[TMP0]], align 8 27*0ad6be19SJonas Paulsson; CHECK-NEXT: ret void 28aba39c39SJonas Paulsson; 29aba39c39SJonas Paulsson; REMARK-LABEL: Function: fun0 30aba39c39SJonas Paulsson; REMARK: Args: 31*0ad6be19SJonas Paulsson; REMARK-NEXT: - String: 'SLP vectorized with cost ' 32*0ad6be19SJonas Paulsson; REMARK-NEXT: - Cost: '-1' 33aba39c39SJonas Paulsson 34aba39c39SJonas Paulsson %3 = fmul double %1, 2.000000e+00 35aba39c39SJonas Paulsson %4 = tail call double @llvm.fmuladd.f64(double %3, double %3, double 0.000000e+00) 36aba39c39SJonas Paulsson %5 = tail call double @llvm.fmuladd.f64(double %3, double %3, double %4) 37aba39c39SJonas Paulsson %sqrt1 = tail call double @llvm.sqrt.f64(double %5) 38aba39c39SJonas Paulsson %6 = load double, ptr %0, align 8 39aba39c39SJonas Paulsson %7 = fmul double %6, 2.000000e+00 40aba39c39SJonas Paulsson %8 = tail call double @llvm.fmuladd.f64(double %7, double %7, double 0.000000e+00) 41aba39c39SJonas Paulsson %9 = tail call double @llvm.fmuladd.f64(double %7, double %7, double %8) 42aba39c39SJonas Paulsson %sqrt = tail call double @llvm.sqrt.f64(double %9) 43aba39c39SJonas Paulsson %10 = fadd double %sqrt1, %sqrt 44aba39c39SJonas Paulsson store double %10, ptr %0, align 8 45aba39c39SJonas Paulsson ret void 46aba39c39SJonas Paulsson} 47aba39c39SJonas Paulsson 48aba39c39SJonas Paulsson; This function needs the element-load to be recognized in SystemZ 49aba39c39SJonas Paulsson; getVectorInstrCost(). 50aba39c39SJonas Paulssondefine void @fun1(double %0) { 51aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun1( 52*0ad6be19SJonas Paulsson; CHECK-SAME: double [[TMP0:%.*]]) #[[ATTR1]] { 53*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> <double 0.000000e+00, double poison>, double [[TMP0]], i32 1 54*0ad6be19SJonas Paulsson; CHECK-NEXT: br label %[[BB3:.*]] 55*0ad6be19SJonas Paulsson; CHECK: [[BB3]]: 56*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP4:%.*]] = phi <2 x double> [ <double poison, double undef>, [[TMP1:%.*]] ], [ poison, %[[BB3]] ] 57*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP5:%.*]] = phi <2 x double> [ zeroinitializer, [[TMP1]] ], [ poison, %[[BB3]] ] 58*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP6:%.*]] = phi <2 x double> [ zeroinitializer, [[TMP1]] ], [ [[TMP18:%.*]], %[[BB3]] ] 59*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP7:%.*]] = fsub <2 x double> zeroinitializer, [[TMP6]] 60*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP8:%.*]] = fsub <2 x double> zeroinitializer, [[TMP5]] 61*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP9:%.*]] = fsub <2 x double> zeroinitializer, [[TMP4]] 62*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP10:%.*]] = load double, ptr null, align 8 63*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP11:%.*]] = fmul <2 x double> [[TMP7]], zeroinitializer 64*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP12:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP8]], <2 x double> [[TMP8]], <2 x double> [[TMP11]]) 65*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP13:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP9]], <2 x double> [[TMP12]]) 66*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP14:%.*]] = fcmp olt <2 x double> [[TMP13]], [[TMP2]] 67*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP15:%.*]] = extractelement <2 x i1> [[TMP14]], i32 0 68*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x i1> [[TMP14]], i32 1 69*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]] 70*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP18]] = insertelement <2 x double> poison, double [[TMP10]], i32 1 71*0ad6be19SJonas Paulsson; CHECK-NEXT: br label %[[BB3]] 72aba39c39SJonas Paulsson; 73aba39c39SJonas Paulsson; REMARK-LABEL: Function: fun1 74aba39c39SJonas Paulsson; REMARK: Args: 75*0ad6be19SJonas Paulsson; REMARK: - String: 'SLP vectorized with cost ' 76*0ad6be19SJonas Paulsson; REMARK-NEXT: - Cost: '-1' 77aba39c39SJonas Paulsson 78aba39c39SJonas Paulsson br label %2 79aba39c39SJonas Paulsson 80aba39c39SJonas Paulsson2: 81aba39c39SJonas Paulsson %3 = phi double [ poison, %1 ], [ poison, %2 ] 82aba39c39SJonas Paulsson %4 = phi double [ undef, %1 ], [ poison, %2 ] 83aba39c39SJonas Paulsson %5 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ] 84aba39c39SJonas Paulsson %6 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ] 85aba39c39SJonas Paulsson %7 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ] 86aba39c39SJonas Paulsson %8 = phi double [ 0.000000e+00, %1 ], [ %21, %2 ] 87aba39c39SJonas Paulsson %9 = fsub double 0.000000e+00, %8 88aba39c39SJonas Paulsson %10 = fsub double 0.000000e+00, %7 89aba39c39SJonas Paulsson %11 = fmul double %9, 0.000000e+00 90aba39c39SJonas Paulsson %12 = fmul double %10, 0.000000e+00 91aba39c39SJonas Paulsson %13 = fsub double 0.000000e+00, %6 92aba39c39SJonas Paulsson %14 = fsub double 0.000000e+00, %5 93aba39c39SJonas Paulsson %15 = tail call double @llvm.fmuladd.f64(double %13, double %13, double %11) 94aba39c39SJonas Paulsson %16 = tail call double @llvm.fmuladd.f64(double %14, double %14, double %12) 95aba39c39SJonas Paulsson %17 = fsub double 0.000000e+00, %4 96aba39c39SJonas Paulsson %18 = fsub double 0.000000e+00, %3 97aba39c39SJonas Paulsson %19 = tail call double @llvm.fmuladd.f64(double %17, double %17, double %15) 98aba39c39SJonas Paulsson %20 = tail call double @llvm.fmuladd.f64(double %18, double %18, double %16) 99aba39c39SJonas Paulsson %21 = load double, ptr null, align 8 100aba39c39SJonas Paulsson %22 = fcmp olt double %19, %0 101aba39c39SJonas Paulsson %23 = fcmp olt double %20, 0.000000e+00 102aba39c39SJonas Paulsson %24 = or i1 %23, %22 103aba39c39SJonas Paulsson br label %2 104aba39c39SJonas Paulsson} 105aba39c39SJonas Paulsson 106aba39c39SJonas Paulsson; This should *not* be vectorized as the insertion into the vector isn't free, 107aba39c39SJonas Paulsson; which is recognized in SystemZTTImpl::getScalarizationOverhead(). 108aba39c39SJonas Paulssondefine void @fun2(ptr %0, ptr %Dst) { 109aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun2( 110*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]], ptr [[DST:%.*]]) #[[ATTR1]] { 111*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[TMP0]], align 8 112*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], 0 113*0ad6be19SJonas Paulsson; CHECK-NEXT: br i1 [[TMP3]], label %[[BB4:.*]], label %[[BB5:.*]] 114*0ad6be19SJonas Paulsson; CHECK: [[BB4]]: 115*0ad6be19SJonas Paulsson; CHECK-NEXT: ret void 116*0ad6be19SJonas Paulsson; CHECK: [[BB5]]: 117*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[DST]], i64 24 118*0ad6be19SJonas Paulsson; CHECK-NEXT: store i64 [[TMP2]], ptr [[TMP6]], align 8 119*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[DST]], i64 16 120*0ad6be19SJonas Paulsson; CHECK-NEXT: store i64 0, ptr [[TMP7]], align 8 121*0ad6be19SJonas Paulsson; CHECK-NEXT: br label %[[BB4]] 122aba39c39SJonas Paulsson; 123*0ad6be19SJonas Paulsson; REMARK-NOT: Function: fun2 124aba39c39SJonas Paulsson 125aba39c39SJonas Paulsson %3 = load i64, ptr %0, align 8 126aba39c39SJonas Paulsson %4 = icmp eq i64 %3, 0 127aba39c39SJonas Paulsson br i1 %4, label %5, label %6 128aba39c39SJonas Paulsson 129aba39c39SJonas Paulsson5: 130aba39c39SJonas Paulsson ret void 131aba39c39SJonas Paulsson 132aba39c39SJonas Paulsson6: 133aba39c39SJonas Paulsson %7 = getelementptr i8, ptr %Dst, i64 24 134aba39c39SJonas Paulsson store i64 %3, ptr %7, align 8 135aba39c39SJonas Paulsson %8 = getelementptr i8, ptr %Dst, i64 16 136aba39c39SJonas Paulsson store i64 0, ptr %8, align 8 137aba39c39SJonas Paulsson br label %5 138aba39c39SJonas Paulsson} 139*0ad6be19SJonas Paulsson 140*0ad6be19SJonas Paulsson; This should *not* be vectorized as the load is immediately stored, in which 141*0ad6be19SJonas Paulsson; case MVC is preferred. 142*0ad6be19SJonas Paulssondefine void @fun3(ptr %0) { 143*0ad6be19SJonas Paulsson; CHECK-LABEL: define void @fun3( 144*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]]) #[[ATTR1]] { 145*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr inttoptr (i64 568 to ptr), align 8 146*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 40 147*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 48 148*0ad6be19SJonas Paulsson; CHECK-NEXT: br label %[[BB5:.*]] 149*0ad6be19SJonas Paulsson; CHECK: [[BB5]]: 150*0ad6be19SJonas Paulsson; CHECK-NEXT: store ptr null, ptr [[TMP3]], align 8, !tbaa [[TBAA0:![0-9]+]] 151*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr inttoptr (i64 64 to ptr), align 8, !tbaa [[TBAA8:![0-9]+]] 152*0ad6be19SJonas Paulsson; CHECK-NEXT: store ptr [[TMP6]], ptr [[TMP4]], align 8 153*0ad6be19SJonas Paulsson; CHECK-NEXT: [[TMP7:%.*]] = tail call i64 [[TMP0]](ptr noundef poison, i64 noundef poison) 154*0ad6be19SJonas Paulsson; CHECK-NEXT: br label %[[BB5]] 155*0ad6be19SJonas Paulsson; 156*0ad6be19SJonas Paulsson %2 = load ptr, ptr inttoptr (i64 568 to ptr), align 8 157*0ad6be19SJonas Paulsson %3 = getelementptr inbounds nuw i8, ptr %2, i64 40 158*0ad6be19SJonas Paulsson %4 = getelementptr inbounds nuw i8, ptr %2, i64 48 159*0ad6be19SJonas Paulsson br label %5 160*0ad6be19SJonas Paulsson 161*0ad6be19SJonas Paulsson5: 162*0ad6be19SJonas Paulsson store ptr null, ptr %3, align 8, !tbaa !1 163*0ad6be19SJonas Paulsson %6 = load ptr, ptr inttoptr (i64 64 to ptr), align 8, !tbaa !9 164*0ad6be19SJonas Paulsson store ptr %6, ptr %4, align 8 165*0ad6be19SJonas Paulsson %7 = tail call i64 %0(ptr noundef poison, i64 noundef poison) 166*0ad6be19SJonas Paulsson br label %5 167*0ad6be19SJonas Paulsson} 168*0ad6be19SJonas Paulsson 169*0ad6be19SJonas Paulsson!1 = !{!2, !7, i64 40} 170*0ad6be19SJonas Paulsson!2 = !{!"arc", !3, i64 0, !6, i64 8, !7, i64 16, !7, i64 24, !8, i64 32, !7, i64 40, !7, i64 48, !6, i64 56, !6, i64 64} 171*0ad6be19SJonas Paulsson!3 = !{!"int", !4, i64 0} 172*0ad6be19SJonas Paulsson!4 = !{!"omnipotent char", !5, i64 0} 173*0ad6be19SJonas Paulsson!5 = !{!"Simple C/C++ TBAA"} 174*0ad6be19SJonas Paulsson!6 = !{!"long", !4, i64 0} 175*0ad6be19SJonas Paulsson!7 = !{!"any pointer", !4, i64 0} 176*0ad6be19SJonas Paulsson!8 = !{!"short", !4, i64 0} 177*0ad6be19SJonas Paulsson!9 = !{!10, !7, i64 64} 178*0ad6be19SJonas Paulsson!10 = !{!"node", !6, i64 0, !3, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !6, i64 80, !6, i64 88, !3, i64 96, !3, i64 100} 179*0ad6be19SJonas Paulsson;. 180*0ad6be19SJonas Paulsson; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META6:![0-9]+]], i64 40} 181*0ad6be19SJonas Paulsson; CHECK: [[META1]] = !{!"arc", [[META2:![0-9]+]], i64 0, [[META5:![0-9]+]], i64 8, [[META6]], i64 16, [[META6]], i64 24, [[META7:![0-9]+]], i64 32, [[META6]], i64 40, [[META6]], i64 48, [[META5]], i64 56, [[META5]], i64 64} 182*0ad6be19SJonas Paulsson; CHECK: [[META2]] = !{!"int", [[META3:![0-9]+]], i64 0} 183*0ad6be19SJonas Paulsson; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0} 184*0ad6be19SJonas Paulsson; CHECK: [[META4]] = !{!"Simple C/C++ TBAA"} 185*0ad6be19SJonas Paulsson; CHECK: [[META5]] = !{!"long", [[META3]], i64 0} 186*0ad6be19SJonas Paulsson; CHECK: [[META6]] = !{!"any pointer", [[META3]], i64 0} 187*0ad6be19SJonas Paulsson; CHECK: [[META7]] = !{!"short", [[META3]], i64 0} 188*0ad6be19SJonas Paulsson; CHECK: [[TBAA8]] = !{[[META9:![0-9]+]], [[META6]], i64 64} 189*0ad6be19SJonas Paulsson; CHECK: [[META9]] = !{!"node", [[META5]], i64 0, [[META2]], i64 8, [[META6]], i64 16, [[META6]], i64 24, [[META6]], i64 32, [[META6]], i64 40, [[META6]], i64 48, [[META6]], i64 56, [[META6]], i64 64, [[META6]], i64 72, [[META5]], i64 80, [[META5]], i64 88, [[META2]], i64 96, [[META2]], i64 100} 190*0ad6be19SJonas Paulsson;. 191