1*0a6a1f1dSLionel Sambuc; RUN: opt < %s -basicaa -slp-vectorizer -S | FileCheck %s 2*0a6a1f1dSLionel Sambuctarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 3*0a6a1f1dSLionel Sambuctarget triple = "x86_64-unknown-linux-gnu" 4*0a6a1f1dSLionel Sambuc 5*0a6a1f1dSLionel Sambuc@b = common global [4 x i32] zeroinitializer, align 16 6*0a6a1f1dSLionel Sambuc@c = common global [4 x i32] zeroinitializer, align 16 7*0a6a1f1dSLionel Sambuc@d = common global [4 x i32] zeroinitializer, align 16 8*0a6a1f1dSLionel Sambuc@e = common global [4 x i32] zeroinitializer, align 16 9*0a6a1f1dSLionel Sambuc@a = common global [4 x i32] zeroinitializer, align 16 10*0a6a1f1dSLionel Sambuc@fb = common global [4 x float] zeroinitializer, align 16 11*0a6a1f1dSLionel Sambuc@fc = common global [4 x float] zeroinitializer, align 16 12*0a6a1f1dSLionel Sambuc@fa = common global [4 x float] zeroinitializer, align 16 13*0a6a1f1dSLionel Sambuc 14*0a6a1f1dSLionel Sambuc; CHECK-LABEL: @addsub 15*0a6a1f1dSLionel Sambuc; CHECK: %5 = add nsw <4 x i32> %3, %4 16*0a6a1f1dSLionel Sambuc; CHECK: %6 = add nsw <4 x i32> %2, %5 17*0a6a1f1dSLionel Sambuc; CHECK: %7 = sub nsw <4 x i32> %2, %5 18*0a6a1f1dSLionel Sambuc; CHECK: %8 = shufflevector <4 x i32> %6, <4 x i32> %7, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 19*0a6a1f1dSLionel Sambuc 20*0a6a1f1dSLionel Sambuc; Function Attrs: nounwind uwtable 21*0a6a1f1dSLionel Sambucdefine void @addsub() #0 { 22*0a6a1f1dSLionel Sambucentry: 23*0a6a1f1dSLionel Sambuc %0 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 0), align 4 24*0a6a1f1dSLionel Sambuc %1 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 0), align 4 25*0a6a1f1dSLionel Sambuc %add = add nsw i32 %0, %1 26*0a6a1f1dSLionel Sambuc %2 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 0), align 4 27*0a6a1f1dSLionel Sambuc %3 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 0), align 4 28*0a6a1f1dSLionel Sambuc %add1 = add nsw i32 %2, %3 29*0a6a1f1dSLionel Sambuc %add2 = add nsw i32 %add, %add1 30*0a6a1f1dSLionel Sambuc store i32 %add2, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 0), align 4 31*0a6a1f1dSLionel Sambuc %4 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 1), align 4 32*0a6a1f1dSLionel Sambuc %5 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 1), align 4 33*0a6a1f1dSLionel Sambuc %add3 = add nsw i32 %4, %5 34*0a6a1f1dSLionel Sambuc %6 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 1), align 4 35*0a6a1f1dSLionel Sambuc %7 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 1), align 4 36*0a6a1f1dSLionel Sambuc %add4 = add nsw i32 %6, %7 37*0a6a1f1dSLionel Sambuc %sub = sub nsw i32 %add3, %add4 38*0a6a1f1dSLionel Sambuc store i32 %sub, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 1), align 4 39*0a6a1f1dSLionel Sambuc %8 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 2), align 4 40*0a6a1f1dSLionel Sambuc %9 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 2), align 4 41*0a6a1f1dSLionel Sambuc %add5 = add nsw i32 %8, %9 42*0a6a1f1dSLionel Sambuc %10 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 2), align 4 43*0a6a1f1dSLionel Sambuc %11 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 2), align 4 44*0a6a1f1dSLionel Sambuc %add6 = add nsw i32 %10, %11 45*0a6a1f1dSLionel Sambuc %add7 = add nsw i32 %add5, %add6 46*0a6a1f1dSLionel Sambuc store i32 %add7, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 2), align 4 47*0a6a1f1dSLionel Sambuc %12 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 3), align 4 48*0a6a1f1dSLionel Sambuc %13 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 3), align 4 49*0a6a1f1dSLionel Sambuc %add8 = add nsw i32 %12, %13 50*0a6a1f1dSLionel Sambuc %14 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 3), align 4 51*0a6a1f1dSLionel Sambuc %15 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 3), align 4 52*0a6a1f1dSLionel Sambuc %add9 = add nsw i32 %14, %15 53*0a6a1f1dSLionel Sambuc %sub10 = sub nsw i32 %add8, %add9 54*0a6a1f1dSLionel Sambuc store i32 %sub10, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 3), align 4 55*0a6a1f1dSLionel Sambuc ret void 56*0a6a1f1dSLionel Sambuc} 57*0a6a1f1dSLionel Sambuc 58*0a6a1f1dSLionel Sambuc; CHECK-LABEL: @subadd 59*0a6a1f1dSLionel Sambuc; CHECK: %5 = add nsw <4 x i32> %3, %4 60*0a6a1f1dSLionel Sambuc; CHECK: %6 = sub nsw <4 x i32> %2, %5 61*0a6a1f1dSLionel Sambuc; CHECK: %7 = add nsw <4 x i32> %2, %5 62*0a6a1f1dSLionel Sambuc; CHECK: %8 = shufflevector <4 x i32> %6, <4 x i32> %7, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 63*0a6a1f1dSLionel Sambuc 64*0a6a1f1dSLionel Sambuc; Function Attrs: nounwind uwtable 65*0a6a1f1dSLionel Sambucdefine void @subadd() #0 { 66*0a6a1f1dSLionel Sambucentry: 67*0a6a1f1dSLionel Sambuc %0 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 0), align 4 68*0a6a1f1dSLionel Sambuc %1 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 0), align 4 69*0a6a1f1dSLionel Sambuc %add = add nsw i32 %0, %1 70*0a6a1f1dSLionel Sambuc %2 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 0), align 4 71*0a6a1f1dSLionel Sambuc %3 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 0), align 4 72*0a6a1f1dSLionel Sambuc %add1 = add nsw i32 %2, %3 73*0a6a1f1dSLionel Sambuc %sub = sub nsw i32 %add, %add1 74*0a6a1f1dSLionel Sambuc store i32 %sub, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 0), align 4 75*0a6a1f1dSLionel Sambuc %4 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 1), align 4 76*0a6a1f1dSLionel Sambuc %5 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 1), align 4 77*0a6a1f1dSLionel Sambuc %add2 = add nsw i32 %4, %5 78*0a6a1f1dSLionel Sambuc %6 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 1), align 4 79*0a6a1f1dSLionel Sambuc %7 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 1), align 4 80*0a6a1f1dSLionel Sambuc %add3 = add nsw i32 %6, %7 81*0a6a1f1dSLionel Sambuc %add4 = add nsw i32 %add2, %add3 82*0a6a1f1dSLionel Sambuc store i32 %add4, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 1), align 4 83*0a6a1f1dSLionel Sambuc %8 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 2), align 4 84*0a6a1f1dSLionel Sambuc %9 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 2), align 4 85*0a6a1f1dSLionel Sambuc %add5 = add nsw i32 %8, %9 86*0a6a1f1dSLionel Sambuc %10 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 2), align 4 87*0a6a1f1dSLionel Sambuc %11 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 2), align 4 88*0a6a1f1dSLionel Sambuc %add6 = add nsw i32 %10, %11 89*0a6a1f1dSLionel Sambuc %sub7 = sub nsw i32 %add5, %add6 90*0a6a1f1dSLionel Sambuc store i32 %sub7, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 2), align 4 91*0a6a1f1dSLionel Sambuc %12 = load i32* getelementptr inbounds ([4 x i32]* @b, i32 0, i64 3), align 4 92*0a6a1f1dSLionel Sambuc %13 = load i32* getelementptr inbounds ([4 x i32]* @c, i32 0, i64 3), align 4 93*0a6a1f1dSLionel Sambuc %add8 = add nsw i32 %12, %13 94*0a6a1f1dSLionel Sambuc %14 = load i32* getelementptr inbounds ([4 x i32]* @d, i32 0, i64 3), align 4 95*0a6a1f1dSLionel Sambuc %15 = load i32* getelementptr inbounds ([4 x i32]* @e, i32 0, i64 3), align 4 96*0a6a1f1dSLionel Sambuc %add9 = add nsw i32 %14, %15 97*0a6a1f1dSLionel Sambuc %add10 = add nsw i32 %add8, %add9 98*0a6a1f1dSLionel Sambuc store i32 %add10, i32* getelementptr inbounds ([4 x i32]* @a, i32 0, i64 3), align 4 99*0a6a1f1dSLionel Sambuc ret void 100*0a6a1f1dSLionel Sambuc} 101*0a6a1f1dSLionel Sambuc 102*0a6a1f1dSLionel Sambuc; CHECK-LABEL: @faddfsub 103*0a6a1f1dSLionel Sambuc; CHECK: %2 = fadd <4 x float> %0, %1 104*0a6a1f1dSLionel Sambuc; CHECK: %3 = fsub <4 x float> %0, %1 105*0a6a1f1dSLionel Sambuc; CHECK: %4 = shufflevector <4 x float> %2, <4 x float> %3, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 106*0a6a1f1dSLionel Sambuc; Function Attrs: nounwind uwtable 107*0a6a1f1dSLionel Sambucdefine void @faddfsub() #0 { 108*0a6a1f1dSLionel Sambucentry: 109*0a6a1f1dSLionel Sambuc %0 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 0), align 4 110*0a6a1f1dSLionel Sambuc %1 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 0), align 4 111*0a6a1f1dSLionel Sambuc %add = fadd float %0, %1 112*0a6a1f1dSLionel Sambuc store float %add, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 0), align 4 113*0a6a1f1dSLionel Sambuc %2 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 1), align 4 114*0a6a1f1dSLionel Sambuc %3 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 1), align 4 115*0a6a1f1dSLionel Sambuc %sub = fsub float %2, %3 116*0a6a1f1dSLionel Sambuc store float %sub, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 1), align 4 117*0a6a1f1dSLionel Sambuc %4 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 2), align 4 118*0a6a1f1dSLionel Sambuc %5 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 2), align 4 119*0a6a1f1dSLionel Sambuc %add1 = fadd float %4, %5 120*0a6a1f1dSLionel Sambuc store float %add1, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 2), align 4 121*0a6a1f1dSLionel Sambuc %6 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 3), align 4 122*0a6a1f1dSLionel Sambuc %7 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 3), align 4 123*0a6a1f1dSLionel Sambuc %sub2 = fsub float %6, %7 124*0a6a1f1dSLionel Sambuc store float %sub2, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 3), align 4 125*0a6a1f1dSLionel Sambuc ret void 126*0a6a1f1dSLionel Sambuc} 127*0a6a1f1dSLionel Sambuc 128*0a6a1f1dSLionel Sambuc; CHECK-LABEL: @fsubfadd 129*0a6a1f1dSLionel Sambuc; CHECK: %2 = fsub <4 x float> %0, %1 130*0a6a1f1dSLionel Sambuc; CHECK: %3 = fadd <4 x float> %0, %1 131*0a6a1f1dSLionel Sambuc; CHECK: %4 = shufflevector <4 x float> %2, <4 x float> %3, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 132*0a6a1f1dSLionel Sambuc; Function Attrs: nounwind uwtable 133*0a6a1f1dSLionel Sambucdefine void @fsubfadd() #0 { 134*0a6a1f1dSLionel Sambucentry: 135*0a6a1f1dSLionel Sambuc %0 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 0), align 4 136*0a6a1f1dSLionel Sambuc %1 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 0), align 4 137*0a6a1f1dSLionel Sambuc %sub = fsub float %0, %1 138*0a6a1f1dSLionel Sambuc store float %sub, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 0), align 4 139*0a6a1f1dSLionel Sambuc %2 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 1), align 4 140*0a6a1f1dSLionel Sambuc %3 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 1), align 4 141*0a6a1f1dSLionel Sambuc %add = fadd float %2, %3 142*0a6a1f1dSLionel Sambuc store float %add, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 1), align 4 143*0a6a1f1dSLionel Sambuc %4 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 2), align 4 144*0a6a1f1dSLionel Sambuc %5 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 2), align 4 145*0a6a1f1dSLionel Sambuc %sub1 = fsub float %4, %5 146*0a6a1f1dSLionel Sambuc store float %sub1, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 2), align 4 147*0a6a1f1dSLionel Sambuc %6 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 3), align 4 148*0a6a1f1dSLionel Sambuc %7 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 3), align 4 149*0a6a1f1dSLionel Sambuc %add2 = fadd float %6, %7 150*0a6a1f1dSLionel Sambuc store float %add2, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 3), align 4 151*0a6a1f1dSLionel Sambuc ret void 152*0a6a1f1dSLionel Sambuc} 153*0a6a1f1dSLionel Sambuc 154*0a6a1f1dSLionel Sambuc; CHECK-LABEL: @No_faddfsub 155*0a6a1f1dSLionel Sambuc; CHECK-NOT: fadd <4 x float> 156*0a6a1f1dSLionel Sambuc; CHECK-NOT: fsub <4 x float> 157*0a6a1f1dSLionel Sambuc; CHECK-NOT: shufflevector 158*0a6a1f1dSLionel Sambuc; Function Attrs: nounwind uwtable 159*0a6a1f1dSLionel Sambucdefine void @No_faddfsub() #0 { 160*0a6a1f1dSLionel Sambucentry: 161*0a6a1f1dSLionel Sambuc %0 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 0), align 4 162*0a6a1f1dSLionel Sambuc %1 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 0), align 4 163*0a6a1f1dSLionel Sambuc %add = fadd float %0, %1 164*0a6a1f1dSLionel Sambuc store float %add, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 0), align 4 165*0a6a1f1dSLionel Sambuc %2 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 1), align 4 166*0a6a1f1dSLionel Sambuc %3 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 1), align 4 167*0a6a1f1dSLionel Sambuc %add1 = fadd float %2, %3 168*0a6a1f1dSLionel Sambuc store float %add1, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 1), align 4 169*0a6a1f1dSLionel Sambuc %4 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 2), align 4 170*0a6a1f1dSLionel Sambuc %5 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 2), align 4 171*0a6a1f1dSLionel Sambuc %add2 = fadd float %4, %5 172*0a6a1f1dSLionel Sambuc store float %add2, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 2), align 4 173*0a6a1f1dSLionel Sambuc %6 = load float* getelementptr inbounds ([4 x float]* @fb, i32 0, i64 3), align 4 174*0a6a1f1dSLionel Sambuc %7 = load float* getelementptr inbounds ([4 x float]* @fc, i32 0, i64 3), align 4 175*0a6a1f1dSLionel Sambuc %sub = fsub float %6, %7 176*0a6a1f1dSLionel Sambuc store float %sub, float* getelementptr inbounds ([4 x float]* @fa, i32 0, i64 3), align 4 177*0a6a1f1dSLionel Sambuc ret void 178*0a6a1f1dSLionel Sambuc} 179*0a6a1f1dSLionel Sambuc 180*0a6a1f1dSLionel Sambucattributes #0 = { nounwind } 181*0a6a1f1dSLionel Sambuc 182