[LLVM][Alignment] Make functions using log of alignment explicit
[llvm-complete.git] / test / CodeGen / PowerPC / store-constant.ll
blobbc847028e9801b93d98c7448439af1498ab23111
1 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
3 @CVal = external local_unnamed_addr global i8, align 1
4 @SVal = external local_unnamed_addr global i16, align 2
5 @IVal = external local_unnamed_addr global i32, align 4
6 @LVal = external local_unnamed_addr global i64, align 8
7 @USVal = external local_unnamed_addr global i16, align 2
8 @arr = external local_unnamed_addr global i64*, align 8
9 @arri = external local_unnamed_addr global i32*, align 8
11 ; Test the same constant can be used by different stores.
13 %struct.S = type { i64, i8, i16, i32 }
15 define void @foo(%struct.S* %p) {
16   %l4 = bitcast %struct.S* %p to i64*
17   store i64 0, i64* %l4, align 8
18   %c = getelementptr %struct.S, %struct.S* %p, i64 0, i32 1
19   store i8 0, i8* %c, align 8
20   %s = getelementptr %struct.S, %struct.S* %p, i64 0, i32 2
21   store i16 0, i16* %s, align 2
22   %i = getelementptr %struct.S, %struct.S* %p, i64 0, i32 3
23   store i32 0, i32* %i, align 4
24   ret void
26 ; CHECK-LABEL: @foo
27 ; CHECK:       li 4, 0
28 ; CHECK:       stb 4, 8(3)
29 ; CHECK:       std 4, 0(3)
30 ; CHECK:       sth 4, 10(3)
31 ; CHECK:       stw 4, 12(3)
34 define void @bar(%struct.S* %p) {
35   %i = getelementptr %struct.S, %struct.S* %p, i64 0, i32 3
36   store i32 2, i32* %i, align 4
37   %s = getelementptr %struct.S, %struct.S* %p, i64 0, i32 2
38   store i16 2, i16* %s, align 2
39   %c = getelementptr %struct.S, %struct.S* %p, i64 0, i32 1
40   store i8 2, i8* %c, align 8
41   %l4 = bitcast %struct.S* %p to i64*
42   store i64 2, i64* %l4, align 8
43   ret void
45 ; CHECK-LABEL: @bar
46 ; CHECK:       li 4, 2
47 ; CHECK-DAG:       stw 4, 12(3)
48 ; CHECK-DAG:       sth 4, 10(3)
49 ; CHECK-DAG:       std 4, 0(3)
50 ; CHECK-DAG:       stb 4, 8(3)
53 ; Function Attrs: norecurse nounwind
54 define void @setSmallNeg() {
55 entry:
56   store i8 -7, i8* @CVal, align 1
57   store i16 -7, i16* @SVal, align 2
58   store i32 -7, i32* @IVal, align 4
59   store i64 -7, i64* @LVal, align 8
60   ret void
61 ; CHECK-LABEL: setSmallNeg
62 ; CHECK: li 7, -7
63 ; CHECK-DAG: stb 7,
64 ; CHECK-DAG: sth 7,
65 ; CHECK-DAG: stw 7,
66 ; CHECK-DAG: std 7,
69 ; Function Attrs: norecurse nounwind
70 define void @setSmallPos() {
71 entry:
72   store i8 8, i8* @CVal, align 1
73   store i16 8, i16* @SVal, align 2
74   store i32 8, i32* @IVal, align 4
75   store i64 8, i64* @LVal, align 8
76   ret void
77 ; CHECK-LABEL: setSmallPos
78 ; CHECK: li 7, 8
79 ; CHECK-DAG: stb 7,
80 ; CHECK-DAG: sth 7,
81 ; CHECK-DAG: stw 7,
82 ; CHECK-DAG: std 7,
85 ; Function Attrs: norecurse nounwind
86 define void @setMaxNeg() {
87 entry:
88   store i16 -32768, i16* @SVal, align 2
89   store i32 -32768, i32* @IVal, align 4
90   store i64 -32768, i64* @LVal, align 8
91   ret void
92 ; CHECK-LABEL: setMaxNeg
93 ; CHECK: li 6, -32768
94 ; CHECK-DAG: sth 6,
95 ; CHECK-DAG: stw 6,
96 ; CHECK-DAG: std 6,
99 ; Function Attrs: norecurse nounwind
100 define void @setMaxPos() {
101 entry:
102   store i16 32767, i16* @SVal, align 2
103   store i32 32767, i32* @IVal, align 4
104   store i64 32767, i64* @LVal, align 8
105   ret void
106 ; CHECK-LABEL: setMaxPos
107 ; CHECK: li 6, 32767
108 ; CHECK-DAG: sth 6,
109 ; CHECK-DAG: stw 6,
110 ; CHECK-DAG: std 6,
113 ; Function Attrs: norecurse nounwind
114 define void @setExcessiveNeg() {
115 entry:
116   store i32 -32769, i32* @IVal, align 4
117   store i64 -32769, i64* @LVal, align 8
118   ret void
119 ; CHECK-LABEL: setExcessiveNeg
120 ; CHECK: lis 5, -1
121 ; CHECK: ori 5, 5, 32767
122 ; CHECK-DAG: stw 5,
123 ; CHECK-DAG: std 5,
126 ; Function Attrs: norecurse nounwind
127 define void @setExcessivePos() {
128 entry:
129   store i16 -32768, i16* @USVal, align 2
130   store i32 32768, i32* @IVal, align 4
131   store i64 32768, i64* @LVal, align 8
132   ret void
133 ; CHECK-LABEL: setExcessivePos
134 ; CHECK: li 6, 0
135 ; CHECK: ori 6, 6, 32768
136 ; CHECK-DAG: sth 6,
137 ; CHECK-DAG: stw 6,
138 ; CHECK-DAG: std 6,
141 define void @SetArr(i32 signext %Len) {
142 entry:
143   %cmp7 = icmp sgt i32 %Len, 0
144   br i1 %cmp7, label %for.body.lr.ph, label %for.cond.cleanup
146 for.body.lr.ph:                                   ; preds = %entry
147   %0 = load i64*, i64** @arr, align 8
148   %1 = load i32*, i32** @arri, align 8
149   %wide.trip.count = zext i32 %Len to i64
150   br label %for.body
152 for.cond.cleanup:                                 ; preds = %for.body, %entry
153   ret void
155 for.body:                                         ; preds = %for.body, %for.body.lr.ph
156   %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ]
157   %arrayidx = getelementptr inbounds i64, i64* %0, i64 %indvars.iv
158   store i64 -7, i64* %arrayidx, align 8
159   %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
160   store i32 -7, i32* %arrayidx2, align 4
161   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
162   %exitcond = icmp eq i64 %indvars.iv.next, %wide.trip.count
163   br i1 %exitcond, label %for.cond.cleanup, label %for.body
164 ; CHECK-LABEL: SetArr
165 ; CHECK: li 5, -7
166 ; CHECK: stdu 5, 8(3)
167 ; CHECK: stwu 5, 4(4)
170 define void @setSameValDiffSizeCI() {
171 entry:
172   store i32 255, i32* @IVal, align 4
173   store i8 -1, i8* @CVal, align 1
174   ret void
175 ; CHECK-LABEL: setSameValDiffSizeCI
176 ; CHECK: li 5, 255
177 ; CHECK-DAG: stb 5,
178 ; CHECK-DAG: stw 5,
181 define void @setSameValDiffSizeSI() {
182 entry:
183   store i32 65535, i32* @IVal, align 4
184   store i16 -1, i16* @SVal, align 2
185   ret void
186 ; CHECK-LABEL: setSameValDiffSizeSI
187 ; CHECK: li 5, 0
188 ; CHECK: ori 5, 5, 65535
189 ; CHECK-DAG: sth 5,
190 ; CHECK-DAG: stw 5,