1; RUN: llc -verify-machineinstrs -mcpu=ppc64 < %s | FileCheck %s -check-prefixes=CHECK,GENERIC
2; RUN: llc -verify-machineinstrs -mcpu=970 < %s | FileCheck %s -check-prefixes=CHECK,PWR
3; RUN: llc -verify-machineinstrs -mcpu=a2 < %s | FileCheck %s -check-prefixes=CHECK,BASIC
4; RUN: llc -verify-machineinstrs -mcpu=e500mc < %s | FileCheck %s -check-prefixes=CHECK,BASIC
5; RUN: llc -verify-machineinstrs -mcpu=e5500 < %s | FileCheck %s -check-prefixes=CHECK,BASIC
6; RUN: llc -verify-machineinstrs -mcpu=pwr4 < %s | FileCheck %s -check-prefixes=CHECK,PWR
7; RUN: llc -verify-machineinstrs -mcpu=pwr5 < %s | FileCheck %s -check-prefixes=CHECK,PWR
8; RUN: llc -verify-machineinstrs -mcpu=pwr5x < %s | FileCheck %s -check-prefixes=CHECK,PWR
9; RUN: llc -verify-machineinstrs -mcpu=pwr6 < %s | FileCheck %s -check-prefixes=CHECK,PWR
10; RUN: llc -verify-machineinstrs -mcpu=pwr6x < %s | FileCheck %s -check-prefixes=CHECK,PWR
11; RUN: llc -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=CHECK,PWR
12; RUN: llc -verify-machineinstrs -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=CHECK,PWR
13target datalayout = "E-m:e-i64:64-n32:64"
14target triple = "powerpc64-unknown-linux-gnu"
15
16; Function Attrs: nounwind readnone
17define signext i32 @foo(i32 signext %x) #0 {
18entry:
19  %mul = shl nsw i32 %x, 1
20  ret i32 %mul
21
22; CHECK-LABEL: .globl  foo
23; GENERIC: .p2align  2
24; BASIC: .p2align  4
25; PWR: .p2align  4
26; CHECK: @foo
27}
28
29; Function Attrs: nounwind
30define void @loop(i32 signext %x, i32* nocapture %a) #1 {
31entry:
32  br label %vector.body
33
34; CHECK-LABEL: @loop
35; CHECK: mtctr
36; GENERIC-NOT: .p2align
37; BASIC: .p2align  4
38; PWR: .p2align  4
39; CHECK: lwzu
40; CHECK: bdnz
41
42vector.body:                                      ; preds = %vector.body, %entry
43  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
44  %induction45 = or i64 %index, 1
45  %0 = getelementptr inbounds i32, i32* %a, i64 %index
46  %1 = getelementptr inbounds i32, i32* %a, i64 %induction45
47  %2 = load i32, i32* %0, align 4
48  %3 = load i32, i32* %1, align 4
49  %4 = add nsw i32 %2, 4
50  %5 = add nsw i32 %3, 4
51  %6 = mul nsw i32 %4, 3
52  %7 = mul nsw i32 %5, 3
53  store i32 %6, i32* %0, align 4
54  store i32 %7, i32* %1, align 4
55  %index.next = add i64 %index, 2
56  %8 = icmp eq i64 %index.next, 2048
57  br i1 %8, label %for.end, label %vector.body
58
59for.end:                                          ; preds = %vector.body
60  ret void
61}
62
63; Function Attrs: nounwind
64define void @sloop(i32 signext %x, i32* nocapture %a) #1 {
65entry:
66  br label %for.body
67
68; CHECK-LABEL: @sloop
69; CHECK: mtctr
70; GENERIC-NOT: .p2align
71; BASIC: .p2align  4
72; PWR: .p2align  5
73; CHECK: bdnz
74
75for.body:                                         ; preds = %for.body, %entry
76  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
77  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
78  %0 = load i32, i32* %arrayidx, align 4
79  %add = add nsw i32 %0, 4
80  %mul = mul nsw i32 %add, 3
81  store i32 %mul, i32* %arrayidx, align 4
82  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
83  %exitcond = icmp eq i64 %indvars.iv.next, 2048
84  br i1 %exitcond, label %for.end, label %for.body
85
86for.end:                                          ; preds = %for.body
87  ret void
88}
89
90; Function Attrs: nounwind
91define void @test_minsize(i32 signext %x, i32* nocapture %a) #2 {
92entry:
93  br label %vector.body
94
95; CHECK-LABEL: @test_minsize
96; CHECK: mtctr
97; GENERIC-NOT: .p2align
98; BASIC-NOT: .p2align
99; PWR-NOT: .p2align
100; CHECK: lwzu
101; CHECK: bdnz
102
103vector.body:                                      ; preds = %vector.body, %entry
104  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
105  %induction45 = or i64 %index, 1
106  %0 = getelementptr inbounds i32, i32* %a, i64 %index
107  %1 = getelementptr inbounds i32, i32* %a, i64 %induction45
108  %2 = load i32, i32* %0, align 4
109  %3 = load i32, i32* %1, align 4
110  %4 = add nsw i32 %2, 4
111  %5 = add nsw i32 %3, 4
112  %6 = mul nsw i32 %4, 3
113  %7 = mul nsw i32 %5, 3
114  store i32 %6, i32* %0, align 4
115  store i32 %7, i32* %1, align 4
116  %index.next = add i64 %index, 2
117  %8 = icmp eq i64 %index.next, 2048
118  br i1 %8, label %for.end, label %vector.body
119
120for.end:                                          ; preds = %vector.body
121  ret void
122}
123attributes #0 = { nounwind readnone }
124attributes #1 = { nounwind }
125attributes #2 = { nounwind minsize}
126
127