; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
; RUN: opt -mtriple=x86_64-unknown-linux-gnu -passes=slp-vectorizer -S < %s | FileCheck %s
define void @test() {
; CHECK-LABEL: define void @test() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[IDX2:%.*]] = getelementptr [1000 x i64], ptr null, i64 0, i64 7
; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i64>, ptr [[IDX2]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i64>, ptr [[IDX2]], align 8
; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr null, align 8
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[OP_RDX25:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[TMP6:%.*]] = phi <8 x i64> [ [[TMP0]], [[ENTRY]] ], [ [[TMP1]], [[LOOP]] ]
; CHECK-NEXT: [[TMP7:%.*]] = mul <8 x i64> [[TMP6]], <i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4, i64 4>
; CHECK-NEXT: [[TMP5:%.*]] = mul <8 x i64> [[TMP1]], <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP7]])
; CHECK-NEXT: [[TMP8:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP5]])
; CHECK-NEXT: [[OP_RDX16:%.*]] = add i64 [[TMP9]], [[TMP8]]
; CHECK-NEXT: [[OP_RDX25]] = add i64 [[OP_RDX16]], [[TMP3]]
; CHECK-NEXT: br label [[LOOP]]
;
entry:
%idx1 = getelementptr [1000 x i64], ptr null, i64 0, i64 9
%idx2 = getelementptr [1000 x i64], ptr null, i64 0, i64 7
%ld1 = load i64, ptr %idx2, align 8
%idx3 = getelementptr [1000 x i64], ptr null, i64 0, i64 8
%ld2 = load i64, ptr %idx3, align 16
%ld3 = load i64, ptr %idx1, align 8
%idx4 = getelementptr [1000 x i64], ptr null, i64 0, i64 10
%ld4 = load i64, ptr %idx4, align 16
%idx5 = getelementptr [1000 x i64], ptr null, i64 0, i64 11
%ld5 = load i64, ptr %idx5, align 8
%idx6 = getelementptr [1000 x i64], ptr null, i64 0, i64 12
%ld6 = load i64, ptr %idx6, align 16
%idx7 = getelementptr [1000 x i64], ptr null, i64 0, i64 13
%ld7 = load i64, ptr %idx7, align 8
%idx8 = getelementptr [1000 x i64], ptr null, i64 0, i64 14
%ld8 = load i64, ptr %idx8, align 16
%0 = load i64, ptr %idx2, align 8
%1 = load i64, ptr %idx3, align 16
%2 = load i64, ptr %idx1, align 8
%3 = load i64, ptr %idx4, align 16
%4 = load i64, ptr %idx5, align 8
%5 = load i64, ptr %idx6, align 16
%6 = load i64, ptr %idx7, align 8
%7 = load i64, ptr %idx8, align 16
%8 = load i64, ptr null, align 8
br label %loop
loop: ; preds = %loop, %entry
%9 = phi i64 [ %ld8, %entry ], [ %7, %loop ]
%10 = phi i64 [ %ld7, %entry ], [ %6, %loop ]
%11 = phi i64 [ %ld6, %entry ], [ %5, %loop ]
%12 = phi i64 [ %ld5, %entry ], [ %4, %loop ]
%13 = phi i64 [ %ld4, %entry ], [ %3, %loop ]
%14 = phi i64 [ %ld3, %entry ], [ %2, %loop ]
%15 = phi i64 [ %ld2, %entry ], [ %1, %loop ]
%16 = phi i64 [ %ld1, %entry ], [ %0, %loop ]
%phi1 = phi i64 [ 0, %entry ], [ %64, %loop ]
%17 = add i64 %16, %15
%18 = add i64 %17, %14
%19 = add i64 %18, %13
%20 = add i64 %19, %12
%21 = add i64 %20, %11
%22 = add i64 %21, %10
%23 = add i64 %22, %9
%24 = add i64 %23, %16
%25 = add i64 %24, %15
%26 = add i64 %25, %14
%27 = add i64 %26, %13
%28 = add i64 %27, %12
%29 = add i64 %28, %11
%30 = add i64 %29, %10
%31 = add i64 %30, %9
%32 = add i64 %31, %16
%33 = add i64 %32, %15
%34 = add i64 %33, %14
%35 = add i64 %34, %13
%36 = add i64 %35, %12
%37 = add i64 %36, %11
%38 = add i64 %37, %10
%39 = add i64 %38, %9
%40 = add i64 %39, %16
%41 = add i64 %40, %15
%42 = add i64 %41, %14
%43 = add i64 %42, %13
%44 = add i64 %43, %12
%45 = add i64 %44, %11
%46 = add i64 %45, %10
%47 = add i64 %46, %9
%48 = add i64 %47, %0
%49 = add i64 %48, %1
%50 = add i64 %49, %2
%51 = add i64 %50, %3
%52 = add i64 %51, %4
%53 = add i64 %52, %5
%54 = add i64 %53, %6
%55 = add i64 %54, %7
%56 = add i64 %55, %8
%57 = add i64 %56, %0
%58 = add i64 %57, %1
%59 = add i64 %58, %2
%60 = add i64 %59, %3
%61 = add i64 %60, %4
%62 = add i64 %61, %5
%63 = add i64 %62, %6
%64 = add i64 %63, %7
br label %loop
}