blob: bc847028e9801b93d98c7448439af1498ab23111 [file] [log] [blame]
Guozhi Wei433e8d32017-11-16 18:27:34 +00001; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
2
Nemanja Ivanovicb0783cc2017-12-12 12:09:34 +00003@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
10
Guozhi Wei433e8d32017-11-16 18:27:34 +000011; Test the same constant can be used by different stores.
12
13%struct.S = type { i64, i8, i16, i32 }
14
15define 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
25
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)
32}
33
34define 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
44
45; CHECK-LABEL: @bar
46; CHECK: li 4, 2
Stefan Pintiliecb4f0c52018-07-04 18:54:25 +000047; 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)
Guozhi Wei433e8d32017-11-16 18:27:34 +000051}
52
Nemanja Ivanovicb0783cc2017-12-12 12:09:34 +000053; Function Attrs: norecurse nounwind
54define void @setSmallNeg() {
55entry:
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,
67}
68
69; Function Attrs: norecurse nounwind
70define void @setSmallPos() {
71entry:
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,
83}
84
85; Function Attrs: norecurse nounwind
86define void @setMaxNeg() {
87entry:
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,
97}
98
99; Function Attrs: norecurse nounwind
100define void @setMaxPos() {
101entry:
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,
111}
112
113; Function Attrs: norecurse nounwind
114define void @setExcessiveNeg() {
115entry:
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,
124}
125
126; Function Attrs: norecurse nounwind
127define void @setExcessivePos() {
128entry:
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,
139}
140
141define void @SetArr(i32 signext %Len) {
142entry:
143 %cmp7 = icmp sgt i32 %Len, 0
144 br i1 %cmp7, label %for.body.lr.ph, label %for.cond.cleanup
145
146for.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
151
152for.cond.cleanup: ; preds = %for.body, %entry
153 ret void
154
155for.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)
168}
169
170define void @setSameValDiffSizeCI() {
171entry:
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,
179}
180
181define void @setSameValDiffSizeSI() {
182entry:
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,
191}