annotate test/CodeGen/RISCV/mem.ll @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
134
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
3 ; RUN: | FileCheck %s -check-prefix=RV32I
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
4
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
5 ; Check indexed and unindexed, sext, zext and anyext loads
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
7 define i32 @lb(i8 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
8 ; RV32I-LABEL: lb:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
9 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
10 ; RV32I-NEXT: lb a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
11 ; RV32I-NEXT: lb a0, 1(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
12 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
13 %1 = getelementptr i8, i8* %a, i32 1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
14 %2 = load i8, i8* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
15 %3 = sext i8 %2 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
16 ; the unused load will produce an anyext for selection
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
17 %4 = load volatile i8, i8* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
18 ret i32 %3
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
19 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
20
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
21 define i32 @lh(i16 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
22 ; RV32I-LABEL: lh:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
23 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
24 ; RV32I-NEXT: lh a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
25 ; RV32I-NEXT: lh a0, 4(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
26 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
27 %1 = getelementptr i16, i16* %a, i32 2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
28 %2 = load i16, i16* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
29 %3 = sext i16 %2 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
30 ; the unused load will produce an anyext for selection
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
31 %4 = load volatile i16, i16* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
32 ret i32 %3
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
33 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
34
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
35 define i32 @lw(i32 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
36 ; RV32I-LABEL: lw:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
37 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
38 ; RV32I-NEXT: lw a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
39 ; RV32I-NEXT: lw a0, 12(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
40 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
41 %1 = getelementptr i32, i32* %a, i32 3
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
42 %2 = load i32, i32* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
43 %3 = load volatile i32, i32* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
44 ret i32 %2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
45 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
46
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
47 define i32 @lbu(i8 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
48 ; RV32I-LABEL: lbu:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
49 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
50 ; RV32I-NEXT: lbu a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
51 ; RV32I-NEXT: lbu a0, 4(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
52 ; RV32I-NEXT: add a0, a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
53 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
54 %1 = getelementptr i8, i8* %a, i32 4
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
55 %2 = load i8, i8* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
56 %3 = zext i8 %2 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
57 %4 = load volatile i8, i8* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
58 %5 = zext i8 %4 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
59 %6 = add i32 %3, %5
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
60 ret i32 %6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
61 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
62
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
63 define i32 @lhu(i16 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
64 ; RV32I-LABEL: lhu:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
65 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
66 ; RV32I-NEXT: lhu a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
67 ; RV32I-NEXT: lhu a0, 10(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
68 ; RV32I-NEXT: add a0, a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
69 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
70 %1 = getelementptr i16, i16* %a, i32 5
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
71 %2 = load i16, i16* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
72 %3 = zext i16 %2 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
73 %4 = load volatile i16, i16* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
74 %5 = zext i16 %4 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
75 %6 = add i32 %3, %5
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
76 ret i32 %6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
77 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
78
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
79 ; Check indexed and unindexed stores
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
80
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
81 define void @sb(i8 *%a, i8 %b) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
82 ; RV32I-LABEL: sb:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
83 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
84 ; RV32I-NEXT: sb a1, 6(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
85 ; RV32I-NEXT: sb a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
86 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
87 store i8 %b, i8* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
88 %1 = getelementptr i8, i8* %a, i32 6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
89 store i8 %b, i8* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
90 ret void
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
91 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
92
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
93 define void @sh(i16 *%a, i16 %b) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
94 ; RV32I-LABEL: sh:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
95 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
96 ; RV32I-NEXT: sh a1, 14(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
97 ; RV32I-NEXT: sh a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
98 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
99 store i16 %b, i16* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
100 %1 = getelementptr i16, i16* %a, i32 7
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
101 store i16 %b, i16* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
102 ret void
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
103 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
104
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
105 define void @sw(i32 *%a, i32 %b) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
106 ; RV32I-LABEL: sw:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
107 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
108 ; RV32I-NEXT: sw a1, 32(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
109 ; RV32I-NEXT: sw a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
110 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
111 store i32 %b, i32* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
112 %1 = getelementptr i32, i32* %a, i32 8
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
113 store i32 %b, i32* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
114 ret void
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
115 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
116
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
117 ; Check load and store to an i1 location
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
118 define i32 @load_sext_zext_anyext_i1(i1 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
119 ; RV32I-LABEL: load_sext_zext_anyext_i1:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
120 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
121 ; RV32I-NEXT: lb a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
122 ; RV32I-NEXT: lbu a1, 1(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
123 ; RV32I-NEXT: lbu a0, 2(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
124 ; RV32I-NEXT: sub a0, a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
125 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
126 ; sextload i1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
127 %1 = getelementptr i1, i1* %a, i32 1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
128 %2 = load i1, i1* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
129 %3 = sext i1 %2 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
130 ; zextload i1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
131 %4 = getelementptr i1, i1* %a, i32 2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
132 %5 = load i1, i1* %4
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
133 %6 = zext i1 %5 to i32
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
134 %7 = add i32 %3, %6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
135 ; extload i1 (anyext). Produced as the load is unused.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
136 %8 = load volatile i1, i1* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
137 ret i32 %7
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
138 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
139
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
140 define i16 @load_sext_zext_anyext_i1_i16(i1 *%a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
141 ; RV32I-LABEL: load_sext_zext_anyext_i1_i16:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
142 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
143 ; RV32I-NEXT: lb a1, 0(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
144 ; RV32I-NEXT: lbu a1, 1(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
145 ; RV32I-NEXT: lbu a0, 2(a0)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
146 ; RV32I-NEXT: sub a0, a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
147 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
148 ; sextload i1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
149 %1 = getelementptr i1, i1* %a, i32 1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
150 %2 = load i1, i1* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
151 %3 = sext i1 %2 to i16
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
152 ; zextload i1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
153 %4 = getelementptr i1, i1* %a, i32 2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
154 %5 = load i1, i1* %4
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
155 %6 = zext i1 %5 to i16
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
156 %7 = add i16 %3, %6
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
157 ; extload i1 (anyext). Produced as the load is unused.
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
158 %8 = load volatile i1, i1* %a
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
159 ret i16 %7
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
160 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
161
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
162 ; Check load and store to a global
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
163 @G = global i32 0
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
164
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
165 define i32 @lw_sw_global(i32 %a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
166 ; TODO: the addi should be folded in to the lw/sw operations
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
167 ; RV32I-LABEL: lw_sw_global:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
168 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
169 ; RV32I-NEXT: lui a1, %hi(G)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
170 ; RV32I-NEXT: addi a2, a1, %lo(G)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
171 ; RV32I-NEXT: lw a1, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
172 ; RV32I-NEXT: sw a0, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
173 ; RV32I-NEXT: lui a2, %hi(G+36)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
174 ; RV32I-NEXT: addi a2, a2, %lo(G+36)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
175 ; RV32I-NEXT: lw a3, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
176 ; RV32I-NEXT: sw a0, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
177 ; RV32I-NEXT: mv a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
178 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
179 %1 = load volatile i32, i32* @G
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
180 store i32 %a, i32* @G
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
181 %2 = getelementptr i32, i32* @G, i32 9
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
182 %3 = load volatile i32, i32* %2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
183 store i32 %a, i32* %2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
184 ret i32 %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
185 }
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
186
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
187 ; Ensure that 1 is added to the high 20 bits if bit 11 of the low part is 1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
188 define i32 @lw_sw_constant(i32 %a) nounwind {
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
189 ; TODO: the addi should be folded in to the lw/sw
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
190 ; RV32I-LABEL: lw_sw_constant:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
191 ; RV32I: # %bb.0:
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
192 ; RV32I-NEXT: lui a1, 912092
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
193 ; RV32I-NEXT: addi a2, a1, -273
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
194 ; RV32I-NEXT: lw a1, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
195 ; RV32I-NEXT: sw a0, 0(a2)
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
196 ; RV32I-NEXT: mv a0, a1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
197 ; RV32I-NEXT: ret
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
198 %1 = inttoptr i32 3735928559 to i32*
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
199 %2 = load volatile i32, i32* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
200 store i32 %a, i32* %1
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
201 ret i32 %2
3a76565eade5 update 5.0.1
mir3636
parents:
diff changeset
202 }