Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: test/Transforms/NaCl/expand-integers.ll

Issue 1151093004: Changes from 3.7 merge to files not in upstream (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 ; RUN: opt < %s -nacl-expand-ints -S | FileCheck %s 1 ; RUN: opt < %s -nacl-expand-ints -S | FileCheck %s
2 ; Test large integer expansion for operations required for large packed 2 ; Test large integer expansion for operations required for large packed
3 ; bitfields. 3 ; bitfields.
4 4
5 ; CHECK-LABEL: @simpleload 5 ; CHECK-LABEL: @simpleload
6 define void @simpleload(i32* %a) { 6 define void @simpleload(i32* %a) {
7 ; CHECK: %a96.loty = bitcast i96* %a96 to i64* 7 ; CHECK: %a96.loty = bitcast i96* %a96 to i64*
8 ; CHECK-NEXT: %load.lo = load i64* %a96.loty 8 ; CHECK-NEXT: %load.lo = load i64, i64* %a96.loty
9 ; CHECK-NEXT: %a96.hi.gep = getelementptr i64* %a96.loty, i32 1 9 ; CHECK-NEXT: %a96.hi.gep = getelementptr i64, i64* %a96.loty, i32 1
10 ; CHECK-NEXT: %a96.hity = bitcast i64* %a96.hi.gep to i32* 10 ; CHECK-NEXT: %a96.hity = bitcast i64* %a96.hi.gep to i32*
11 ; CHECK-NEXT: %load.hi = load i32* %a96.hity 11 ; CHECK-NEXT: %load.hi = load i32, i32* %a96.hity
12 %a96 = bitcast i32* %a to i96* 12 %a96 = bitcast i32* %a to i96*
13 %load = load i96* %a96 13 %load = load i96, i96* %a96
14 14
15 ; CHECK: %a128.loty = bitcast i128* %a128 to i64* 15 ; CHECK: %a128.loty = bitcast i128* %a128 to i64*
16 ; CHECK-NEXT: %load128.lo = load i64* %a128.loty 16 ; CHECK-NEXT: %load128.lo = load i64, i64* %a128.loty
17 ; CHECK-NEXT: %a128.hi.gep = getelementptr i64* %a128.loty, i32 1 17 ; CHECK-NEXT: %a128.hi.gep = getelementptr i64, i64* %a128.loty, i32 1
18 ; CHECK-NEXT: %load128.hi = load i64* %a128.hi.gep 18 ; CHECK-NEXT: %load128.hi = load i64, i64* %a128.hi.gep
19 %a128 = bitcast i32* %a to i128* 19 %a128 = bitcast i32* %a to i128*
20 %load128 = load i128* %a128 20 %load128 = load i128, i128* %a128
21 21
22 ; CHECK: %a256.loty = bitcast i256* %a256 to i64* 22 ; CHECK: %a256.loty = bitcast i256* %a256 to i64*
23 ; CHECK-NEXT: %load256.lo = load i64* %a256.loty 23 ; CHECK-NEXT: %load256.lo = load i64, i64* %a256.loty
24 ; CHECK-NEXT: %a256.hi.gep = getelementptr i64* %a256.loty, i32 1 24 ; CHECK-NEXT: %a256.hi.gep = getelementptr i64, i64* %a256.loty, i32 1
25 ; CHECK-NEXT: %a256.hity = bitcast i64* %a256.hi.gep to i192* 25 ; CHECK-NEXT: %a256.hity = bitcast i64* %a256.hi.gep to i192*
26 ; intermediate expansion: %load256.hi = load i192* %a256.hity 26 ; intermediate expansion: %load256.hi = load i192, i192* %a256.hity
27 ; CHECK-NEXT: %a256.hity.loty = bitcast i192* %a256.hity to i64* 27 ; CHECK-NEXT: %a256.hity.loty = bitcast i192* %a256.hity to i64*
28 ; CHECK-NEXT: %load256.hi.lo = load i64* %a256.hity.loty 28 ; CHECK-NEXT: %load256.hi.lo = load i64, i64* %a256.hity.loty
29 ; CHECK-NEXT: %a256.hity.hi.gep = getelementptr i64* %a256.hity.loty, i32 1 29 ; CHECK-NEXT: %a256.hity.hi.gep = getelementptr i64, i64* %a256.hity.loty, i32 1
30 ; CHECK-NEXT: %a256.hity.hity = bitcast i64* %a256.hity.hi.gep to i128* 30 ; CHECK-NEXT: %a256.hity.hity = bitcast i64* %a256.hity.hi.gep to i128*
31 ; intermediate expansion: %load256.hi.hi = load i128* %a256.hity.hity 31 ; intermediate expansion: %load256.hi.hi = load i128, i128* %a256.hity.hity
32 ; CHECK-NEXT: %a256.hity.hity.loty = bitcast i128* %a256.hity.hity to i64* 32 ; CHECK-NEXT: %a256.hity.hity.loty = bitcast i128* %a256.hity.hity to i64*
33 ; CHECK-NEXT: %load256.hi.hi.lo = load i64* %a256.hity.hity.loty 33 ; CHECK-NEXT: %load256.hi.hi.lo = load i64, i64* %a256.hity.hity.loty
34 ; CHECK-NEXT: %a256.hity.hity.hi.gep = getelementptr i64* %a256.hity.hity.loty, i32 1 34 ; CHECK-NEXT: %a256.hity.hity.hi.gep = getelementptr i64, i64* %a256.hity.hity.l oty, i32 1
35 ; CHECK-NEXT: %load256.hi.hi.hi = load i64* %a256.hity.hity.hi.gep 35 ; CHECK-NEXT: %load256.hi.hi.hi = load i64, i64* %a256.hity.hity.hi.gep
36 %a256 = bitcast i32* %a to i256* 36 %a256 = bitcast i32* %a to i256*
37 %load256 = load i256* %a256 37 %load256 = load i256, i256* %a256
38 ret void 38 ret void
39 } 39 }
40 40
41 ; CHECK-LABEL: @loadalign 41 ; CHECK-LABEL: @loadalign
42 define void @loadalign(i32* %a) { 42 define void @loadalign(i32* %a) {
43 %a96 = bitcast i32* %a to i96* 43 %a96 = bitcast i32* %a to i96*
44 44
45 ; CHECK: %load.lo = load{{.*}}, align 16 45 ; CHECK: %load.lo = load{{.*}}, align 16
46 ; CHECK: %load.hi = load{{.*}}, align 8 46 ; CHECK: %load.hi = load{{.*}}, align 8
47 %load = load i96* %a96, align 16 47 %load = load i96, i96* %a96, align 16
48 48
49 ; CHECK: %loadnoalign.lo = load{{.*}}, align 8 49 ; CHECK: %loadnoalign.lo = load{{.*}}, align 8
50 ; CHECK: %loadnoalign.hi = load{{.*}}, align 8 50 ; CHECK: %loadnoalign.hi = load{{.*}}, align 8
51 %loadnoalign = load i96* %a96 51 %loadnoalign = load i96, i96* %a96
52 52
53 ; CHECK: %load4.lo = load{{.*}}, align 4 53 ; CHECK: %load4.lo = load{{.*}}, align 4
54 ; CHECK: %load4.hi = load{{.*}}, align 4 54 ; CHECK: %load4.hi = load{{.*}}, align 4
55 %load4 = load i96* %a96, align 4 55 %load4 = load i96, i96* %a96, align 4
56 56
57 %a256 = bitcast i32* %a to i256* 57 %a256 = bitcast i32* %a to i256*
58 ; CHECK: %load256.lo = load{{.*}}, align 16 58 ; CHECK: %load256.lo = load{{.*}}, align 16
59 ; CHECK: %load256.hi.lo = load{{.*}}, align 8 59 ; CHECK: %load256.hi.lo = load{{.*}}, align 8
60 ; CHECK: %load256.hi.hi.lo = load{{.*}}, align 8 60 ; CHECK: %load256.hi.hi.lo = load{{.*}}, align 8
61 ; CHECK: %load256.hi.hi.hi = load{{.*}}, align 8 61 ; CHECK: %load256.hi.hi.hi = load{{.*}}, align 8
62 %load256 = load i256* %a256, align 16 62 %load256 = load i256, i256* %a256, align 16
63 ret void 63 ret void
64 } 64 }
65 65
66 ; CHECK-LABEL: @simplestore 66 ; CHECK-LABEL: @simplestore
67 define void @simplestore(i32* %a, i32* %b) { 67 define void @simplestore(i32* %a, i32* %b) {
68 %a96 = bitcast i32* %a to i96* 68 %a96 = bitcast i32* %a to i96*
69 %b96 = bitcast i32* %b to i96* 69 %b96 = bitcast i32* %b to i96*
70 %load96 = load i96* %a96 70 %load96 = load i96, i96* %a96
71 ; CHECK: %b96.loty = bitcast i96* %b96 to i64* 71 ; CHECK: %b96.loty = bitcast i96* %b96 to i64*
72 ; CHECK-NEXT: store i64 %load96.lo, i64* %b96.loty 72 ; CHECK-NEXT: store i64 %load96.lo, i64* %b96.loty
73 ; CHECK-NEXT: %b96.hi.gep = getelementptr i64* %b96.loty, i32 1 73 ; CHECK-NEXT: %b96.hi.gep = getelementptr i64, i64* %b96.loty, i32 1
74 ; CHECK-NEXT: %b96.hity = bitcast i64* %b96.hi.gep to i32* 74 ; CHECK-NEXT: %b96.hity = bitcast i64* %b96.hi.gep to i32*
75 ; CHECK-NEXT: store i32 %load96.hi, i32* %b96.hity 75 ; CHECK-NEXT: store i32 %load96.hi, i32* %b96.hity
76 store i96 %load96, i96* %b96 76 store i96 %load96, i96* %b96
77 77
78 %a128 = bitcast i32* %a to i128* 78 %a128 = bitcast i32* %a to i128*
79 %b128 = bitcast i32* %b to i128* 79 %b128 = bitcast i32* %b to i128*
80 %load128 = load i128* %a128 80 %load128 = load i128, i128* %a128
81 ; CHECK: %b128.loty = bitcast i128* %b128 to i64* 81 ; CHECK: %b128.loty = bitcast i128* %b128 to i64*
82 ; CHECK-NEXT: store i64 %load128.lo, i64* %b128.loty 82 ; CHECK-NEXT: store i64 %load128.lo, i64* %b128.loty
83 ; CHECK-NEXT: %b128.hi.gep = getelementptr i64* %b128.loty, i32 1 83 ; CHECK-NEXT: %b128.hi.gep = getelementptr i64, i64* %b128.loty, i32 1
84 ; CHECK-NEXT: store i64 %load128.hi, i64* %b128.hi.gep 84 ; CHECK-NEXT: store i64 %load128.hi, i64* %b128.hi.gep
85 store i128 %load128, i128* %b128 85 store i128 %load128, i128* %b128
86 86
87 %a256 = bitcast i32* %a to i256* 87 %a256 = bitcast i32* %a to i256*
88 %b256 = bitcast i32* %b to i256* 88 %b256 = bitcast i32* %b to i256*
89 %load256 = load i256* %a256 89 %load256 = load i256, i256* %a256
90 90
91 ; CHECK: %b256.loty = bitcast i256* %b256 to i64* 91 ; CHECK: %b256.loty = bitcast i256* %b256 to i64*
92 ; CHECK-NEXT: store i64 %load256.lo, i64* %b256.loty 92 ; CHECK-NEXT: store i64 %load256.lo, i64* %b256.loty
93 ; CHECK-NEXT: %b256.hi.gep = getelementptr i64* %b256.loty, i32 1 93 ; CHECK-NEXT: %b256.hi.gep = getelementptr i64, i64* %b256.loty, i32 1
94 ; CHECK-NEXT: %b256.hity = bitcast i64* %b256.hi.gep to i192* 94 ; CHECK-NEXT: %b256.hity = bitcast i64* %b256.hi.gep to i192*
95 ; CHECK-NEXT: %b256.hity.loty = bitcast i192* %b256.hity to i64* 95 ; CHECK-NEXT: %b256.hity.loty = bitcast i192* %b256.hity to i64*
96 ; CHECK-NEXT: store i64 %load256.hi.lo, i64* %b256.hity.loty 96 ; CHECK-NEXT: store i64 %load256.hi.lo, i64* %b256.hity.loty
97 ; CHECK-NEXT: %b256.hity.hi.gep = getelementptr i64* %b256.hity.loty, i32 1 97 ; CHECK-NEXT: %b256.hity.hi.gep = getelementptr i64, i64* %b256.hity.loty, i32 1
98 ; CHECK-NEXT: %b256.hity.hity = bitcast i64* %b256.hity.hi.gep to i128* 98 ; CHECK-NEXT: %b256.hity.hity = bitcast i64* %b256.hity.hi.gep to i128*
99 ; CHECK-NEXT: %b256.hity.hity.loty = bitcast i128* %b256.hity.hity to i64* 99 ; CHECK-NEXT: %b256.hity.hity.loty = bitcast i128* %b256.hity.hity to i64*
100 ; CHECK-NEXT: store i64 %load256.hi.hi.lo, i64* %b256.hity.hity.loty 100 ; CHECK-NEXT: store i64 %load256.hi.hi.lo, i64* %b256.hity.hity.loty
101 ; CHECK-NEXT: %b256.hity.hity.hi.gep = getelementptr i64* %b256.hity.hity.loty, i32 1 101 ; CHECK-NEXT: %b256.hity.hity.hi.gep = getelementptr i64, i64* %b256.hity.hity.l oty, i32 1
102 ; CHECK-NEXT: store i64 %load256.hi.hi.hi, i64* %b256.hity.hity.hi.gep 102 ; CHECK-NEXT: store i64 %load256.hi.hi.hi, i64* %b256.hity.hity.hi.gep
103 store i256 %load256, i256* %b256 103 store i256 %load256, i256* %b256
104 ret void 104 ret void
105 } 105 }
106 106
107 ; CHECK-LABEL: @storealign 107 ; CHECK-LABEL: @storealign
108 define void @storealign(i32* %a, i32* %b) { 108 define void @storealign(i32* %a, i32* %b) {
109 %a96 = bitcast i32* %a to i96* 109 %a96 = bitcast i32* %a to i96*
110 %b96 = bitcast i32* %b to i96* 110 %b96 = bitcast i32* %b to i96*
111 %load96 = load i96* %a96 111 %load96 = load i96, i96* %a96
112 112
113 ; CHECK: store i64 %load96.lo{{.*}}, align 16 113 ; CHECK: store i64 %load96.lo{{.*}}, align 16
114 ; CHECK: store i32 %load96.hi{{.*}}, align 8 114 ; CHECK: store i32 %load96.hi{{.*}}, align 8
115 store i96 %load96, i96* %b96, align 16 115 store i96 %load96, i96* %b96, align 16
116 116
117 ; CHECK: store i64 %load96.lo{{.*}}, align 8 117 ; CHECK: store i64 %load96.lo{{.*}}, align 8
118 ; CHECK: store i32 %load96.hi{{.*}}, align 8 118 ; CHECK: store i32 %load96.hi{{.*}}, align 8
119 store i96 %load96, i96* %b96 119 store i96 %load96, i96* %b96
120 120
121 ; CHECK: store i64 %load96.lo{{.*}}, align 4 121 ; CHECK: store i64 %load96.lo{{.*}}, align 4
122 ; CHECK: store i32 %load96.hi{{.*}}, align 4 122 ; CHECK: store i32 %load96.hi{{.*}}, align 4
123 store i96 %load96, i96* %b96, align 4 123 store i96 %load96, i96* %b96, align 4
124 124
125 %a256 = bitcast i32* %a to i256* 125 %a256 = bitcast i32* %a to i256*
126 %b256 = bitcast i32* %b to i256* 126 %b256 = bitcast i32* %b to i256*
127 %load256 = load i256* %a256 127 %load256 = load i256, i256* %a256
128 ; CHECK: store i64 %load256.lo{{.*}}, align 16 128 ; CHECK: store i64 %load256.lo{{.*}}, align 16
129 ; CHECK: store i64 %load256.hi.lo{{.*}}, align 8 129 ; CHECK: store i64 %load256.hi.lo{{.*}}, align 8
130 ; CHECK: store i64 %load256.hi.hi.lo{{.*}}, align 8 130 ; CHECK: store i64 %load256.hi.hi.lo{{.*}}, align 8
131 ; CHECK: store i64 %load256.hi.hi.hi{{.*}}, align 8 131 ; CHECK: store i64 %load256.hi.hi.hi{{.*}}, align 8
132 store i256 %load256, i256* %b256, align 16 132 store i256 %load256, i256* %b256, align 16
133 ret void 133 ret void
134 } 134 }
135 135
136 136
137 ; Check that forward references are handled. 137 ; Check that forward references are handled.
138 ; CHECK-LABEL: @fwdref 138 ; CHECK-LABEL: @fwdref
139 define void @fwdref(i32* %a, i32* %b) { 139 define void @fwdref(i32* %a, i32* %b) {
140 entry: 140 entry:
141 br label %block1 141 br label %block1
142 block2: 142 block2:
143 %b96 = bitcast i32* %b to i96* 143 %b96 = bitcast i32* %b to i96*
144 ; CHECK: store i64 %load96.lo 144 ; CHECK: store i64 %load96.lo
145 ; CHECK: store i32 %load96.hi 145 ; CHECK: store i32 %load96.hi
146 store i96 %load96, i96* %b96 146 store i96 %load96, i96* %b96
147 ret void 147 ret void
148 block1: 148 block1:
149 %a96 = bitcast i32* %a to i96* 149 %a96 = bitcast i32* %a to i96*
150 ; CHECK: load i64* %a96.loty 150 ; CHECK: load i64, i64* %a96.loty
151 ; CHECK: load i32* %a96.hity 151 ; CHECK: load i32, i32* %a96.hity
152 %load96 = load i96* %a96 152 %load96 = load i96, i96* %a96
153 br label %block2 153 br label %block2
154 } 154 }
155 155
156 ; The subsequent tests use loads and stores to produce and consume the expanded 156 ; The subsequent tests use loads and stores to produce and consume the expanded
157 ; values from the opcodes under test. 157 ; values from the opcodes under test.
158 ; CHECK-LABEL: @zext 158 ; CHECK-LABEL: @zext
159 define void @zext(i32 %a, i64 %b, i8* %p) { 159 define void @zext(i32 %a, i64 %b, i8* %p) {
160 %p96 = bitcast i8* %p to i96* 160 %p96 = bitcast i8* %p to i96*
161 %a96 = zext i32 %a to i96 161 %a96 = zext i32 %a to i96
162 ; CHECK: %a96.lo = zext i32 %a to i64 162 ; CHECK: %a96.lo = zext i32 %a to i64
163 store i96 %a96, i96* %p96 163 store i96 %a96, i96* %p96
164 ; CHECK: store i64 %a96.lo, i64* %p96.loty 164 ; CHECK: store i64 %a96.lo, i64* %p96.loty
165 ; CHECK: store i32 0, i32* %p96.hity 165 ; CHECK: store i32 0, i32* %p96.hity
166 166
167 %b96 = zext i64 %b to i96 167 %b96 = zext i64 %b to i96
168 ; CHECK: store i64 %b, i64* %p96.loty 168 ; CHECK: store i64 %b, i64* %p96.loty
169 ; CHECK: store i32 0, i32* %p96.hity 169 ; CHECK: store i32 0, i32* %p96.hity
170 store i96 %b96, i96* %p96 170 store i96 %b96, i96* %p96
171 171
172 %p128 = bitcast i8* %p to i128* 172 %p128 = bitcast i8* %p to i128*
173 %c96 = load i96* %p96 173 %c96 = load i96, i96* %p96
174 ; CHECK: %a128.hi = zext i32 %c96.hi to i64 174 ; CHECK: %a128.hi = zext i32 %c96.hi to i64
175 %a128 = zext i96 %c96 to i128 175 %a128 = zext i96 %c96 to i128
176 ; CHECK: store i64 %c96.lo, i64* %p128.loty 176 ; CHECK: store i64 %c96.lo, i64* %p128.loty
177 ; CHECK: store i64 %a128.hi, i64* %p128.hi.gep 177 ; CHECK: store i64 %a128.hi, i64* %p128.hi.gep
178 store i128 %a128, i128* %p128 178 store i128 %a128, i128* %p128
179 179
180 %p256 = bitcast i8* %p to i256* 180 %p256 = bitcast i8* %p to i256*
181 181
182 ; CHECK: %b256.lo = zext i32 %a to i64 182 ; CHECK: %b256.lo = zext i32 %a to i64
183 %b256 = zext i32 %a to i256 183 %b256 = zext i32 %a to i256
(...skipping 10 matching lines...) Expand all
194 ; CHECK: store i64 0, i64* %p256.hity9.hity.loty 194 ; CHECK: store i64 0, i64* %p256.hity9.hity.loty
195 ; CHECK: store i64 0, i64* %p256.hity9.hity.hi.gep 195 ; CHECK: store i64 0, i64* %p256.hity9.hity.hi.gep
196 store i256 %c256, i256* %p256 196 store i256 %c256, i256* %p256
197 ret void 197 ret void
198 } 198 }
199 199
200 200
201 ; CHECK-LABEL: @bitwise 201 ; CHECK-LABEL: @bitwise
202 define void @bitwise(i32* %a) { 202 define void @bitwise(i32* %a) {
203 %a96p = bitcast i32* %a to i96* 203 %a96p = bitcast i32* %a to i96*
204 %a96 = load i96* %a96p 204 %a96 = load i96, i96* %a96p
205 %b96 = load i96* %a96p 205 %b96 = load i96, i96* %a96p
206 206
207 ; CHECK: %c96.lo = and i64 %a96.lo, %b96.lo 207 ; CHECK: %c96.lo = and i64 %a96.lo, %b96.lo
208 ; CHECK: %c96.hi = and i32 %a96.hi, %b96.hi 208 ; CHECK: %c96.hi = and i32 %a96.hi, %b96.hi
209 %c96 = and i96 %a96, %b96 209 %c96 = and i96 %a96, %b96
210 ; CHECK: %d96.lo = or i64 %a96.lo, %c96.lo 210 ; CHECK: %d96.lo = or i64 %a96.lo, %c96.lo
211 ; CHECK: %d96.hi = or i32 %a96.hi, %c96.hi 211 ; CHECK: %d96.hi = or i32 %a96.hi, %c96.hi
212 %d96 = or i96 %a96, %c96 212 %d96 = or i96 %a96, %c96
213 213
214 ; CHECK: %x96.lo = xor i64 %a96.lo, %c96.lo 214 ; CHECK: %x96.lo = xor i64 %a96.lo, %c96.lo
215 ; CHECK: %x96.hi = xor i32 %a96.hi, %c96.hi 215 ; CHECK: %x96.hi = xor i32 %a96.hi, %c96.hi
216 %x96 = xor i96 %a96, %c96 216 %x96 = xor i96 %a96, %c96
217 ret void 217 ret void
218 } 218 }
219 219
220 ; CHECK-LABEL: @truncs 220 ; CHECK-LABEL: @truncs
221 define void @truncs(i32* %p) { 221 define void @truncs(i32* %p) {
222 %p96 = bitcast i32* %p to i96* 222 %p96 = bitcast i32* %p to i96*
223 %a96 = load i96* %p96 223 %a96 = load i96, i96* %p96
224 224
225 ; CHECK: %t32 = trunc i64 %a96.lo to i32 225 ; CHECK: %t32 = trunc i64 %a96.lo to i32
226 %t32 = trunc i96 %a96 to i32 226 %t32 = trunc i96 %a96 to i32
227 227
228 %b96 = load i96* %p96 228 %b96 = load i96, i96* %p96
229 ; Check that t64 refers directly to the low loaded value from %p96 229 ; Check that t64 refers directly to the low loaded value from %p96
230 ; CHECK: %t64 = load i64* %p96.loty 230 ; CHECK: %t64 = load i64, i64* %p96.loty
231 %t64 = trunc i96 %b96 to i64 231 %t64 = trunc i96 %b96 to i64
232 232
233 %c96 = load i96* %p96 233 %c96 = load i96, i96* %p96
234 ; Use the and to get a use of %t90.lo and check that it refers directly to 234 ; Use the and to get a use of %t90.lo and check that it refers directly to
235 ; %c96.lo 235 ; %c96.lo
236 ; CHECK: %t90.hi = trunc i32 %c96.hi to i26 236 ; CHECK: %t90.hi = trunc i32 %c96.hi to i26
237 ; CHECK: %a90.lo = and i64 %c96.lo, %c96.lo 237 ; CHECK: %a90.lo = and i64 %c96.lo, %c96.lo
238 %t90 = trunc i96 %c96 to i90 238 %t90 = trunc i96 %c96 to i90
239 %t90_2 = trunc i96 %c96 to i90 239 %t90_2 = trunc i96 %c96 to i90
240 %a90 = and i90 %t90, %t90_2 240 %a90 = and i90 %t90, %t90_2
241 ret void 241 ret void
242 } 242 }
243 243
244 ; CHECK-LABEL: @shls 244 ; CHECK-LABEL: @shls
245 define void @shls(i32* %p) { 245 define void @shls(i32* %p) {
246 %p96 = bitcast i32* %p to i96* 246 %p96 = bitcast i32* %p to i96*
247 %a96 = load i96* %p96 247 %a96 = load i96, i96* %p96
248 %p128 = bitcast i32* %p to i128* 248 %p128 = bitcast i32* %p to i128*
249 %a128 = load i128* %p128 249 %a128 = load i128, i128* %p128
250 %p192 = bitcast i32* %p to i192* 250 %p192 = bitcast i32* %p to i192*
251 %a192 = load i192* %p192 251 %a192 = load i192, i192* %p192
252 252
253 ; CHECK: %b96.lo = shl i64 %a96.lo, 5 253 ; CHECK: %b96.lo = shl i64 %a96.lo, 5
254 ; CHECK-NEXT: %b96.lo.shr = lshr i64 %a96.lo, 59 254 ; CHECK-NEXT: %b96.lo.shr = lshr i64 %a96.lo, 59
255 ; CHECK-NEXT: %b96.lo.ext = trunc i64 %b96.lo.shr to i32 255 ; CHECK-NEXT: %b96.lo.ext = trunc i64 %b96.lo.shr to i32
256 ; CHECK-NEXT: %b96.hi.shl = shl i32 %a96.hi, 5 256 ; CHECK-NEXT: %b96.hi.shl = shl i32 %a96.hi, 5
257 ; CHECK-NEXT: %b96.or = or i32 %b96.lo.ext, %b96.hi.shl 257 ; CHECK-NEXT: %b96.or = or i32 %b96.lo.ext, %b96.hi.shl
258 %b96 = shl i96 %a96, 5 258 %b96 = shl i96 %a96, 5
259 259
260 ; CHECK: %d96.lo = shl i64 %a96.lo, 35 260 ; CHECK: %d96.lo = shl i64 %a96.lo, 35
261 ; CHECK-NEXT: %d96.lo.shr = lshr i64 %a96.lo, 29 261 ; CHECK-NEXT: %d96.lo.shr = lshr i64 %a96.lo, 29
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 ; %c192.or.hi = or i64 %c192.lo.shl.lo.shr, %c192.hi.shl.lo.shl 300 ; %c192.or.hi = or i64 %c192.lo.shl.lo.shr, %c192.hi.shl.lo.shl
301 %c192 = shl i192 %a192, 100 301 %c192 = shl i192 %a192, 100
302 store i192 %c192, i192* %p192 302 store i192 %c192, i192* %p192
303 303
304 ret void 304 ret void
305 } 305 }
306 306
307 ; CHECK-LABEL: @lshrs 307 ; CHECK-LABEL: @lshrs
308 define void @lshrs(i32* %p) { 308 define void @lshrs(i32* %p) {
309 %p96 = bitcast i32* %p to i96* 309 %p96 = bitcast i32* %p to i96*
310 %a96 = load i96* %p96 310 %a96 = load i96, i96* %p96
311 %p128 = bitcast i32* %p to i128* 311 %p128 = bitcast i32* %p to i128*
312 %a128 = load i128* %p128 312 %a128 = load i128, i128* %p128
313 %p192 = bitcast i32* %p to i192* 313 %p192 = bitcast i32* %p to i192*
314 %a192 = load i192* %p192 314 %a192 = load i192, i192* %p192
315 315
316 ; CHECK: %b96.hi.shr = lshr i32 %a96.hi, 3 316 ; CHECK: %b96.hi.shr = lshr i32 %a96.hi, 3
317 ; CHECK-NEXT: %b96.lo.ext = zext i32 %b96.hi.shr to i64 317 ; CHECK-NEXT: %b96.lo.ext = zext i32 %b96.hi.shr to i64
318 ; CHECK: store i32 0, i32* %p96.hity 318 ; CHECK: store i32 0, i32* %p96.hity
319 %b96 = lshr i96 %a96, 67 319 %b96 = lshr i96 %a96, 67
320 store i96 %b96, i96* %p96 320 store i96 %b96, i96* %p96
321 321
322 ; CHECK: %c96.hi.ext = zext i32 %a96.hi to i64 322 ; CHECK: %c96.hi.ext = zext i32 %a96.hi to i64
323 ; CHECK-NEXT: %c96.hi.shl = shl i64 %c96.hi.ext, 19 323 ; CHECK-NEXT: %c96.hi.shl = shl i64 %c96.hi.ext, 19
324 ; CHECK-NEXT: %c96.lo.shr = lshr i64 %a96.lo, 45 324 ; CHECK-NEXT: %c96.lo.shr = lshr i64 %a96.lo, 45
(...skipping 29 matching lines...) Expand all
354 } 354 }
355 355
356 ; Make sure that the following doesn't assert out: it generates intermediate 356 ; Make sure that the following doesn't assert out: it generates intermediate
357 ; `trunc` instructions which get progressively smaller and smaller as the 357 ; `trunc` instructions which get progressively smaller and smaller as the
358 ; instructions are cut down. The final bitcode doesn't contain a `trunc` 358 ; instructions are cut down. The final bitcode doesn't contain a `trunc`
359 ; instruction. 359 ; instruction.
360 ; 360 ;
361 ; CHECK-LABEL: @lshr_big 361 ; CHECK-LABEL: @lshr_big
362 define void @lshr_big(i32* %a) { 362 define void @lshr_big(i32* %a) {
363 %p536 = bitcast i32* %a to i536* 363 %p536 = bitcast i32* %a to i536*
364 %loaded = load i536* %p536, align 4 364 %loaded = load i536, i536* %p536, align 4
365 %shifted = lshr i536 %loaded, 161 365 %shifted = lshr i536 %loaded, 161
366 store i536 %shifted, i536* %p536 366 store i536 %shifted, i536* %p536
367 ret void 367 ret void
368 } 368 }
369 369
370 ; CHECK-LABEL: @ashrs 370 ; CHECK-LABEL: @ashrs
371 define void @ashrs(i32* %p) { 371 define void @ashrs(i32* %p) {
372 %p96 = bitcast i32* %p to i96* 372 %p96 = bitcast i32* %p to i96*
373 %a96 = load i96* %p96 373 %a96 = load i96, i96* %p96
374 %p128 = bitcast i32* %p to i128* 374 %p128 = bitcast i32* %p to i128*
375 %a128 = load i128* %p128 375 %a128 = load i128, i128* %p128
376 376
377 ; CHECK: %b96.hi.shr = ashr i32 %a96.hi, 3 377 ; CHECK: %b96.hi.shr = ashr i32 %a96.hi, 3
378 ; CHECK-NEXT: %b96.lo.ext = sext i32 %b96.hi.shr to i64 378 ; CHECK-NEXT: %b96.lo.ext = sext i32 %b96.hi.shr to i64
379 ; CHECK-NEXT: %b96.hi = ashr i32 %a96.hi, 31 379 ; CHECK-NEXT: %b96.hi = ashr i32 %a96.hi, 31
380 %b96 = ashr i96 %a96, 67 380 %b96 = ashr i96 %a96, 67
381 store i96 %b96, i96* %p96 381 store i96 %b96, i96* %p96
382 382
383 ; CHECK: %c96.hi.ext = sext i32 %a96.hi to i64 383 ; CHECK: %c96.hi.ext = sext i32 %a96.hi to i64
384 ; CHECK-NEXT: %c96.hi.shl = shl i64 %c96.hi.ext, 19 384 ; CHECK-NEXT: %c96.hi.shl = shl i64 %c96.hi.ext, 19
385 ; CHECK-NEXT: %c96.lo.shr = lshr i64 %a96.lo, 45 385 ; CHECK-NEXT: %c96.lo.shr = lshr i64 %a96.lo, 45
(...skipping 23 matching lines...) Expand all
409 %c128 = ashr i128 %a128, 43 409 %c128 = ashr i128 %a128, 43
410 store i128 %c128, i128* %p128 410 store i128 %c128, i128* %p128
411 411
412 ret void 412 ret void
413 } 413 }
414 414
415 ; CHECK-LABEL: @adds 415 ; CHECK-LABEL: @adds
416 define void @adds(i32 *%dest, i32* %lhs, i32* %rhs) { 416 define void @adds(i32 *%dest, i32* %lhs, i32* %rhs) {
417 %d = bitcast i32* %dest to i96* 417 %d = bitcast i32* %dest to i96*
418 %lp = bitcast i32* %lhs to i96* 418 %lp = bitcast i32* %lhs to i96*
419 %lv = load i96* %lp 419 %lv = load i96, i96* %lp
420 %rp = bitcast i32* %rhs to i96* 420 %rp = bitcast i32* %rhs to i96*
421 %rv = load i96* %rp 421 %rv = load i96, i96* %rp
422 422
423 ; CHECK: %result.lo = add i64 %lv.lo, %rv.lo 423 ; CHECK: %result.lo = add i64 %lv.lo, %rv.lo
424 ; CHECK-NEXT: %result.cmp = icmp ult i64 %lv.lo, %rv.lo 424 ; CHECK-NEXT: %result.cmp = icmp ult i64 %lv.lo, %rv.lo
425 ; CHECK-NEXT: %result.limit = select i1 %result.cmp, i64 %rv.lo, i64 %lv.lo 425 ; CHECK-NEXT: %result.limit = select i1 %result.cmp, i64 %rv.lo, i64 %lv.lo
426 ; CHECK-NEXT: %result.overflowed = icmp ult i64 %result.lo, %result.limit 426 ; CHECK-NEXT: %result.overflowed = icmp ult i64 %result.lo, %result.limit
427 ; CHECK-NEXT: %result.carry = zext i1 %result.overflowed to i32 427 ; CHECK-NEXT: %result.carry = zext i1 %result.overflowed to i32
428 ; CHECK-NEXT: %result.hi = add i32 %lv.hi, %rv.hi 428 ; CHECK-NEXT: %result.hi = add i32 %lv.hi, %rv.hi
429 ; CHECK-NEXT: %result.carried = add i32 %result.hi, %result.carry 429 ; CHECK-NEXT: %result.carried = add i32 %result.hi, %result.carry
430 %result = add i96 %lv, %rv 430 %result = add i96 %lv, %rv
431 store i96 %result, i96* %d 431 store i96 %result, i96* %d
432 ret void 432 ret void
433 } 433 }
434 434
435 ; CHECK-LABEL: @subs 435 ; CHECK-LABEL: @subs
436 define void @subs(i32 *%dest, i32* %lhs, i32* %rhs) { 436 define void @subs(i32 *%dest, i32* %lhs, i32* %rhs) {
437 %d = bitcast i32* %dest to i96* 437 %d = bitcast i32* %dest to i96*
438 %lp = bitcast i32* %lhs to i96* 438 %lp = bitcast i32* %lhs to i96*
439 %lv = load i96* %lp 439 %lv = load i96, i96* %lp
440 %rp = bitcast i32* %rhs to i96* 440 %rp = bitcast i32* %rhs to i96*
441 %rv = load i96* %rp 441 %rv = load i96, i96* %rp
442 442
443 ; CHECK: %result.borrow = icmp ult i64 %lv.lo, %rv.lo 443 ; CHECK: %result.borrow = icmp ult i64 %lv.lo, %rv.lo
444 ; CHECK-NEXT: %result.borrowing = sext i1 %result.borrow to i32 444 ; CHECK-NEXT: %result.borrowing = sext i1 %result.borrow to i32
445 ; CHECK-NEXT: %result.lo = sub i64 %lv.lo, %rv.lo 445 ; CHECK-NEXT: %result.lo = sub i64 %lv.lo, %rv.lo
446 ; CHECK-NEXT: %result.hi = sub i32 %lv.hi, %rv.hi 446 ; CHECK-NEXT: %result.hi = sub i32 %lv.hi, %rv.hi
447 ; CHECK-NEXT: %result.borrowed = add i32 %result.hi, %result.borrowing 447 ; CHECK-NEXT: %result.borrowed = add i32 %result.hi, %result.borrowing
448 %result = sub i96 %lv, %rv 448 %result = sub i96 %lv, %rv
449 store i96 %result, i96* %d 449 store i96 %result, i96* %d
450 ret void 450 ret void
451 } 451 }
452 452
453 ; CHECK-LABEL: @icmp_equality 453 ; CHECK-LABEL: @icmp_equality
454 define void @icmp_equality(i32* %p) { 454 define void @icmp_equality(i32* %p) {
455 %p96 = bitcast i32* %p to i96* 455 %p96 = bitcast i32* %p to i96*
456 %a96 = load i96* %p96 456 %a96 = load i96, i96* %p96
457 %b96 = load i96* %p96 457 %b96 = load i96, i96* %p96
458 458
459 ; CHECK: %eq.lo = icmp eq i64 %a96.lo, %b96.lo 459 ; CHECK: %eq.lo = icmp eq i64 %a96.lo, %b96.lo
460 ; CHECK-NEXT: %eq.hi = icmp eq i32 %a96.hi, %b96.hi 460 ; CHECK-NEXT: %eq.hi = icmp eq i32 %a96.hi, %b96.hi
461 ; CHECK-NEXT: %eq = and i1 %eq.lo, %eq.hi 461 ; CHECK-NEXT: %eq = and i1 %eq.lo, %eq.hi
462 %eq = icmp eq i96 %a96, %b96 462 %eq = icmp eq i96 %a96, %b96
463 463
464 ; CHECK: %ne.lo = icmp ne i64 %a96.lo, %b96.lo 464 ; CHECK: %ne.lo = icmp ne i64 %a96.lo, %b96.lo
465 ; CHECK-NEXT: %ne.hi = icmp ne i32 %a96.hi, %b96.hi 465 ; CHECK-NEXT: %ne.hi = icmp ne i32 %a96.hi, %b96.hi
466 ; CHECK-NEXT: %ne = and i1 %ne.lo, %ne.hi 466 ; CHECK-NEXT: %ne = and i1 %ne.lo, %ne.hi
467 %ne = icmp ne i96 %a96, %b96 467 %ne = icmp ne i96 %a96, %b96
468 ret void 468 ret void
469 } 469 }
470 470
471 ; CHECK-LABEL: @icmp_uge 471 ; CHECK-LABEL: @icmp_uge
472 define void @icmp_uge(i32* %p) { 472 define void @icmp_uge(i32* %p) {
473 %p96 = bitcast i32* %p to i96* 473 %p96 = bitcast i32* %p to i96*
474 %lv = load i96* %p96 474 %lv = load i96, i96* %p96
475 %rv = load i96* %p96 475 %rv = load i96, i96* %p96
476 ; Do an add. 476 ; Do an add.
477 ; CHECK: %uge.lo = add i64 %lv.lo, %rv.lo 477 ; CHECK: %uge.lo = add i64 %lv.lo, %rv.lo
478 ; CHECK-NEXT: %uge.cmp = icmp ult i64 %lv.lo, %rv.lo 478 ; CHECK-NEXT: %uge.cmp = icmp ult i64 %lv.lo, %rv.lo
479 ; CHECK-NEXT: %uge.limit = select i1 %uge.cmp, i64 %rv.lo, i64 %lv.lo 479 ; CHECK-NEXT: %uge.limit = select i1 %uge.cmp, i64 %rv.lo, i64 %lv.lo
480 ; CHECK-NEXT: %uge.overflowed = icmp ult i64 %uge.lo, %uge.limit 480 ; CHECK-NEXT: %uge.overflowed = icmp ult i64 %uge.lo, %uge.limit
481 ; CHECK-NEXT: %uge.carry = zext i1 %uge.overflowed to i32 481 ; CHECK-NEXT: %uge.carry = zext i1 %uge.overflowed to i32
482 ; CHECK-NEXT: %uge.hi = add i32 %lv.hi, %rv.hi 482 ; CHECK-NEXT: %uge.hi = add i32 %lv.hi, %rv.hi
483 ; CHECK-NEXT: %uge.carried = add i32 %uge.hi, %uge.carry 483 ; CHECK-NEXT: %uge.carried = add i32 %uge.hi, %uge.carry
484 ; Do the hi carry. 484 ; Do the hi carry.
485 ; CHECK-NEXT: %uge.cmp4 = icmp ult i32 %lv.hi, %rv.hi 485 ; CHECK-NEXT: %uge.cmp4 = icmp ult i32 %lv.hi, %rv.hi
486 ; CHECK-NEXT: %uge.limit5 = select i1 %uge.cmp4, i32 %rv.hi, i32 %lv.hi 486 ; CHECK-NEXT: %uge.limit5 = select i1 %uge.cmp4, i32 %rv.hi, i32 %lv.hi
487 ; CHECK-NEXT: %uge = icmp ult i32 %uge.carried, %uge.limit5 487 ; CHECK-NEXT: %uge = icmp ult i32 %uge.carried, %uge.limit5
488 %uge = icmp uge i96 %lv, %rv 488 %uge = icmp uge i96 %lv, %rv
489 ret void 489 ret void
490 } 490 }
491 491
492 ; CHECK-LABEL: @icmp_ule 492 ; CHECK-LABEL: @icmp_ule
493 define void @icmp_ule(i32* %p) { 493 define void @icmp_ule(i32* %p) {
494 %p96 = bitcast i32* %p to i96* 494 %p96 = bitcast i32* %p to i96*
495 %lv = load i96* %p96 495 %lv = load i96, i96* %p96
496 %rv = load i96* %p96 496 %rv = load i96, i96* %p96
497 ; Do an add. 497 ; Do an add.
498 ; CHECK: %ule.lo = add i64 %lv.lo, %rv.lo 498 ; CHECK: %ule.lo = add i64 %lv.lo, %rv.lo
499 ; CHECK-NEXT: %ule.cmp = icmp ult i64 %lv.lo, %rv.lo 499 ; CHECK-NEXT: %ule.cmp = icmp ult i64 %lv.lo, %rv.lo
500 ; CHECK-NEXT: %ule.limit = select i1 %ule.cmp, i64 %rv.lo, i64 %lv.lo 500 ; CHECK-NEXT: %ule.limit = select i1 %ule.cmp, i64 %rv.lo, i64 %lv.lo
501 ; CHECK-NEXT: %ule.overflowed = icmp ult i64 %ule.lo, %ule.limit 501 ; CHECK-NEXT: %ule.overflowed = icmp ult i64 %ule.lo, %ule.limit
502 ; CHECK-NEXT: %ule.carry = zext i1 %ule.overflowed to i32 502 ; CHECK-NEXT: %ule.carry = zext i1 %ule.overflowed to i32
503 ; CHECK-NEXT: %ule.hi = add i32 %lv.hi, %rv.hi 503 ; CHECK-NEXT: %ule.hi = add i32 %lv.hi, %rv.hi
504 ; CHECK-NEXT: %ule.carried = add i32 %ule.hi, %ule.carry 504 ; CHECK-NEXT: %ule.carried = add i32 %ule.hi, %ule.carry
505 ; Do the hi carry. 505 ; Do the hi carry.
506 ; CHECK-NEXT: %ule.cmp4 = icmp ult i32 %lv.hi, %rv.hi 506 ; CHECK-NEXT: %ule.cmp4 = icmp ult i32 %lv.hi, %rv.hi
507 ; CHECK-NEXT: %ule.limit5 = select i1 %ule.cmp4, i32 %rv.hi, i32 %lv.hi 507 ; CHECK-NEXT: %ule.limit5 = select i1 %ule.cmp4, i32 %rv.hi, i32 %lv.hi
508 ; CHECK-NEXT: %ule.overflowed6 = icmp ult i32 %ule.carried, %ule.limit5 508 ; CHECK-NEXT: %ule.overflowed6 = icmp ult i32 %ule.carried, %ule.limit5
509 ; Invert the carry result. 509 ; Invert the carry result.
510 ; CHECK-NEXT: %ule = xor i1 %ule.overflowed6, true 510 ; CHECK-NEXT: %ule = xor i1 %ule.overflowed6, true
511 %ule = icmp ule i96 %lv, %rv 511 %ule = icmp ule i96 %lv, %rv
512 ret void 512 ret void
513 } 513 }
514 514
515 ; CHECK-LABEL: @icmp_ugt 515 ; CHECK-LABEL: @icmp_ugt
516 define void @icmp_ugt(i32* %p) { 516 define void @icmp_ugt(i32* %p) {
517 %p96 = bitcast i32* %p to i96* 517 %p96 = bitcast i32* %p to i96*
518 %lv = load i96* %p96 518 %lv = load i96, i96* %p96
519 %rv = load i96* %p96 519 %rv = load i96, i96* %p96
520 ; Do an add. 520 ; Do an add.
521 ; CHECK: %ugt.lo = add i64 %lv.lo, %rv.lo 521 ; CHECK: %ugt.lo = add i64 %lv.lo, %rv.lo
522 ; CHECK-NEXT: %ugt.cmp = icmp ult i64 %lv.lo, %rv.lo 522 ; CHECK-NEXT: %ugt.cmp = icmp ult i64 %lv.lo, %rv.lo
523 ; CHECK-NEXT: %ugt.limit = select i1 %ugt.cmp, i64 %rv.lo, i64 %lv.lo 523 ; CHECK-NEXT: %ugt.limit = select i1 %ugt.cmp, i64 %rv.lo, i64 %lv.lo
524 ; CHECK-NEXT: %ugt.overflowed = icmp ult i64 %ugt.lo, %ugt.limit 524 ; CHECK-NEXT: %ugt.overflowed = icmp ult i64 %ugt.lo, %ugt.limit
525 ; CHECK-NEXT: %ugt.carry = zext i1 %ugt.overflowed to i32 525 ; CHECK-NEXT: %ugt.carry = zext i1 %ugt.overflowed to i32
526 ; CHECK-NEXT: %ugt.hi = add i32 %lv.hi, %rv.hi 526 ; CHECK-NEXT: %ugt.hi = add i32 %lv.hi, %rv.hi
527 ; CHECK-NEXT: %ugt.carried = add i32 %ugt.hi, %ugt.carry 527 ; CHECK-NEXT: %ugt.carried = add i32 %ugt.hi, %ugt.carry
528 ; Do the hi carry. 528 ; Do the hi carry.
529 ; CHECK-NEXT: %ugt.cmp4 = icmp ult i32 %lv.hi, %rv.hi 529 ; CHECK-NEXT: %ugt.cmp4 = icmp ult i32 %lv.hi, %rv.hi
530 ; CHECK-NEXT: %ugt.limit5 = select i1 %ugt.cmp4, i32 %rv.hi, i32 %lv.hi 530 ; CHECK-NEXT: %ugt.limit5 = select i1 %ugt.cmp4, i32 %rv.hi, i32 %lv.hi
531 ; CHECK-NEXT: %ugt.overflowed6 = icmp ult i32 %ugt.carried, %ugt.limit5 531 ; CHECK-NEXT: %ugt.overflowed6 = icmp ult i32 %ugt.carried, %ugt.limit5
532 ; Equality comparison. 532 ; Equality comparison.
533 ; CHECK-NEXT: %ugt.lo7 = icmp eq i64 %lv.lo, %rv.lo 533 ; CHECK-NEXT: %ugt.lo7 = icmp eq i64 %lv.lo, %rv.lo
534 ; CHECK-NEXT: %ugt.hi8 = icmp eq i32 %lv.hi, %rv.hi 534 ; CHECK-NEXT: %ugt.hi8 = icmp eq i32 %lv.hi, %rv.hi
535 ; CHECK-NEXT: %ugt.eq = and i1 %ugt.lo7, %ugt.hi8 535 ; CHECK-NEXT: %ugt.eq = and i1 %ugt.lo7, %ugt.hi8
536 ; Merge the hi carry and equality comparison results. 536 ; Merge the hi carry and equality comparison results.
537 ; CHECK-NEXT: %ugt = and i1 %ugt.overflowed6, %ugt.eq 537 ; CHECK-NEXT: %ugt = and i1 %ugt.overflowed6, %ugt.eq
538 %ugt = icmp ugt i96 %lv, %rv 538 %ugt = icmp ugt i96 %lv, %rv
539 ret void 539 ret void
540 } 540 }
541 541
542 ; CHECK-LABEL: @icmp_ult 542 ; CHECK-LABEL: @icmp_ult
543 define void @icmp_ult(i32* %p) { 543 define void @icmp_ult(i32* %p) {
544 %p96 = bitcast i32* %p to i96* 544 %p96 = bitcast i32* %p to i96*
545 %lv = load i96* %p96 545 %lv = load i96, i96* %p96
546 %rv = load i96* %p96 546 %rv = load i96, i96* %p96
547 ; Do an add. 547 ; Do an add.
548 ; CHECK: %ult.lo = add i64 %lv.lo, %rv.lo 548 ; CHECK: %ult.lo = add i64 %lv.lo, %rv.lo
549 ; CHECK-NEXT: %ult.cmp = icmp ult i64 %lv.lo, %rv.lo 549 ; CHECK-NEXT: %ult.cmp = icmp ult i64 %lv.lo, %rv.lo
550 ; CHECK-NEXT: %ult.limit = select i1 %ult.cmp, i64 %rv.lo, i64 %lv.lo 550 ; CHECK-NEXT: %ult.limit = select i1 %ult.cmp, i64 %rv.lo, i64 %lv.lo
551 ; CHECK-NEXT: %ult.overflowed = icmp ult i64 %ult.lo, %ult.limit 551 ; CHECK-NEXT: %ult.overflowed = icmp ult i64 %ult.lo, %ult.limit
552 ; CHECK-NEXT: %ult.carry = zext i1 %ult.overflowed to i32 552 ; CHECK-NEXT: %ult.carry = zext i1 %ult.overflowed to i32
553 ; CHECK-NEXT: %ult.hi = add i32 %lv.hi, %rv.hi 553 ; CHECK-NEXT: %ult.hi = add i32 %lv.hi, %rv.hi
554 ; CHECK-NEXT: %ult.carried = add i32 %ult.hi, %ult.carry 554 ; CHECK-NEXT: %ult.carried = add i32 %ult.hi, %ult.carry
555 ; Do the hi carry. 555 ; Do the hi carry.
556 ; CHECK-NEXT: %ult.cmp4 = icmp ult i32 %lv.hi, %rv.hi 556 ; CHECK-NEXT: %ult.cmp4 = icmp ult i32 %lv.hi, %rv.hi
557 ; CHECK-NEXT: %ult.limit5 = select i1 %ult.cmp4, i32 %rv.hi, i32 %lv.hi 557 ; CHECK-NEXT: %ult.limit5 = select i1 %ult.cmp4, i32 %rv.hi, i32 %lv.hi
558 ; CHECK-NEXT: %ult.overflowed6 = icmp ult i32 %ult.carried, %ult.limit5 558 ; CHECK-NEXT: %ult.overflowed6 = icmp ult i32 %ult.carried, %ult.limit5
559 ; Invert the carry result. 559 ; Invert the carry result.
560 ; CHECK-NEXT: %ult7 = xor i1 %ult.overflowed6, true 560 ; CHECK-NEXT: %ult7 = xor i1 %ult.overflowed6, true
561 ; Equality comparison. 561 ; Equality comparison.
562 ; CHECK-NEXT: %ult.lo8 = icmp eq i64 %lv.lo, %rv.lo 562 ; CHECK-NEXT: %ult.lo8 = icmp eq i64 %lv.lo, %rv.lo
563 ; CHECK-NEXT: %ult.hi9 = icmp eq i32 %lv.hi, %rv.hi 563 ; CHECK-NEXT: %ult.hi9 = icmp eq i32 %lv.hi, %rv.hi
564 ; CHECK-NEXT: %ult.eq = and i1 %ult.lo8, %ult.hi9 564 ; CHECK-NEXT: %ult.eq = and i1 %ult.lo8, %ult.hi9
565 ; Merge the hi carry and equality comparison results. 565 ; Merge the hi carry and equality comparison results.
566 ; CHECK-NEXT: %ult = and i1 %ult7, %ult.eq 566 ; CHECK-NEXT: %ult = and i1 %ult7, %ult.eq
567 %ult = icmp ult i96 %lv, %rv 567 %ult = icmp ult i96 %lv, %rv
568 ret void 568 ret void
569 } 569 }
570 570
571 ; CHECK-LABEL: @selects 571 ; CHECK-LABEL: @selects
572 define void @selects(i1 %c, i32* %pl, i32* %pr) { 572 define void @selects(i1 %c, i32* %pl, i32* %pr) {
573 %pl96 = bitcast i32* %pl to i96* 573 %pl96 = bitcast i32* %pl to i96*
574 %pr96 = bitcast i32* %pr to i96* 574 %pr96 = bitcast i32* %pr to i96*
575 %l = load i96* %pl96 575 %l = load i96, i96* %pl96
576 %r = load i96* %pr96 576 %r = load i96, i96* %pr96
577 577
578 ; CHECK: %result.lo = select i1 %c, i64 %l.lo, i64 %r.lo 578 ; CHECK: %result.lo = select i1 %c, i64 %l.lo, i64 %r.lo
579 ; CHECK-NEXT: %result.hi = select i1 %c, i32 %l.hi, i32 %r.hi 579 ; CHECK-NEXT: %result.hi = select i1 %c, i32 %l.hi, i32 %r.hi
580 %result = select i1 %c, i96 %l, i96 %r 580 %result = select i1 %c, i96 %l, i96 %r
581 ret void 581 ret void
582 } 582 }
583 583
584 ; CHECK-LABEL: @phis1 584 ; CHECK-LABEL: @phis1
585 define void @phis1() { 585 define void @phis1() {
586 entry: 586 entry:
(...skipping 15 matching lines...) Expand all
602 ; CHECK-LABEL: @phis2 602 ; CHECK-LABEL: @phis2
603 define void @phis2() { 603 define void @phis2() {
604 entry: 604 entry:
605 br label %label1 605 br label %label1
606 label1: 606 label1:
607 ; CHECK: %foo.lo = phi i64 [ %bar.lo, %label2 ], [ undef, %entry ] 607 ; CHECK: %foo.lo = phi i64 [ %bar.lo, %label2 ], [ undef, %entry ]
608 ; CHECK-NEXT: %foo.hi = phi i8 [ %bar.hi, %label2 ], [ undef, %entry ] 608 ; CHECK-NEXT: %foo.hi = phi i8 [ %bar.hi, %label2 ], [ undef, %entry ]
609 %foo = phi i72 [ %bar, %label2 ], [ undef, %entry ] 609 %foo = phi i72 [ %bar, %label2 ], [ undef, %entry ]
610 br i1 undef, label %label2, label %end 610 br i1 undef, label %label2, label %end
611 label2: 611 label2:
612 ; CHECK: %bar.lo = load i64* undef, align 4 612 ; CHECK: %bar.lo = load i64, i64* undef, align 4
613 ; CHECK-NEXT: %bar.hi = load i8* undef, align 4 613 ; CHECK-NEXT: %bar.hi = load i8, i8* undef, align 4
614 %bar = load i72* undef, align 4 614 %bar = load i72, i72* undef, align 4
615 br label %label1 615 br label %label1
616 end: 616 end:
617 ret void 617 ret void
618 } 618 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698