Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 ; RUN: opt < %s -nacl-promote-ints -S | FileCheck %s | |
| 2 | |
| 3 declare void @consume_i16(i16 %a) | |
| 4 | |
| 5 ; CHECK: @sext_to_illegal | |
| 6 ; CHECK-NEXT: %a40.sext = sext i32 %a to i64 | |
| 7 ; CHECK-NEXT: %a40 = and i64 %a40.sext, 1099511627775 | |
| 8 ; (0xFFFFFFFFFF) | |
| 9 define void @sext_to_illegal(i32 %a) { | |
| 10 %a40 = sext i32 %a to i40 | |
| 11 ret void | |
| 12 } | |
| 13 | |
| 14 ; CHECK; @sext_from_illegal | |
| 15 define void @sext_from_illegal(i8 %a) { | |
| 16 %a12 = sext i8 %a to i12 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
move the definition %a12 = ... closer to the uses?
Derek Schuff
2013/05/08 22:33:28
Done.
| |
| 17 ; CHECK: call void @consume_i16(i16 -2) | |
| 18 %c12 = sext i12 -2 to i16 | |
| 19 call void @consume_i16(i16 %c12) | |
| 20 ; CHECK: %a12.getsign = shl i16 %a12, 4 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
Could add other test cases where the shift amount
Derek Schuff
2013/05/08 22:33:28
Done.
| |
| 21 ; CHECK-NEXT: %a16 = ashr i16 %a12.getsign, 4 | |
| 22 %a16 = sext i12 %a12 to i16 | |
| 23 ; CHECK: %a12.getsign1 = shl i16 %a12, 4 | |
| 24 ; CHECK-NEXT: %a12.signed = ashr i16 %a12.getsign1, 4 | |
| 25 ; CHECK-NEXT: %a14 = and i16 %a12.signed, 16383 | |
| 26 ; (0x3FFF) | |
| 27 %a14 = sext i12 %a12 to i14 | |
| 28 ; CHECK-NEXT: %a12.getsign2 = shl i16 %a12, 4 | |
| 29 ; CHECK-NEXT: %a12.signed3 = ashr i16 %a12.getsign2, 4 | |
| 30 ; CHECK-NEXT: %a24.sext = sext i16 %a12.signed3 to i32 | |
| 31 ; CHECK-NEXT: %a24 = and i32 %a24.sext, 16777215 | |
| 32 ; (0xFFFFFF) | |
| 33 %a24 = sext i12 %a12 to i24 | |
| 34 ret void | |
| 35 } | |
| 36 | |
| 37 ; CHECK: @zext_to_illegal | |
| 38 ; CHECK: zext i32 %a to i64 | |
| 39 define void @zext_to_illegal(i32 %a) { | |
|
jvoung (off chromium)
2013/05/07 01:22:11
CHECK-NOT: for the AND? (or is there an AND)?
Derek Schuff
2013/05/08 22:33:28
Done.
| |
| 40 %a40 = zext i32 %a to i40 | |
| 41 ret void | |
| 42 } | |
| 43 | |
| 44 ; CHECK: @zext_from_illegal | |
| 45 ; TODO(dschuff): make the ANDs no-ops? | |
|
jvoung (off chromium)
2013/05/07 01:22:11
Put the TODO by the first AND?
Derek Schuff
2013/05/08 22:33:28
Done.
| |
| 46 define void @zext_from_illegal(i8 %a) { | |
| 47 ; get some illegal values to start with | |
| 48 %a24 = zext i8 %a to i24 | |
| 49 %a40 = zext i8 %a to i40 | |
| 50 %a18 = zext i8 %a to i18 | |
| 51 | |
| 52 ; CHECK: %a32 = and i32 %a24, 16777215 | |
| 53 ; (0xFFFFFF) | |
| 54 %a32 = zext i24 %a24 to i32 | |
| 55 | |
| 56 ; CHECK: %b24 = and i32 %a18, 262143 | |
| 57 ; (0x3FFFF) | |
| 58 %b24 = zext i18 %a18 to i24 | |
| 59 | |
| 60 ; CHECK: %a24.clear = and i32 %a24, 16777215 | |
| 61 ; CHECK: %b40 = zext i32 %a24.clear to i64 | |
| 62 %b40 = zext i24 %a24 to i40 | |
| 63 | |
| 64 ; CHECK: call void @consume_i16(i16 4094) | |
| 65 %c16 = zext i12 -2 to i16 | |
| 66 call void @consume_i16(i16 %c16) | |
| 67 ; CHECK: call void @consume_i16(i16 4094) | |
| 68 %c14 = zext i12 -2 to i14 | |
| 69 %c16.2 = zext i14 %c14 to i16 | |
| 70 call void @consume_i16(i16 %c16.2) | |
| 71 ret void | |
| 72 } | |
| 73 | |
| 74 define void @trunc_from_illegal(i8 %a) { | |
| 75 %a24 = zext i8 %a to i24 | |
| 76 ; CHECK: %a16 = trunc i32 %a24 to i16 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
same for sext?
Derek Schuff
2013/05/08 22:33:28
same what?
jvoung (off chromium)
2013/05/09 00:06:43
meant test trunc with a var that was sext to illeg
| |
| 77 %a16 = trunc i24 %a24 to i16 | |
| 78 ret void | |
| 79 } | |
| 80 | |
| 81 define void @trunc_to_illegal(i32 %a) { | |
| 82 ; CHECK: %a24 = and i32 %a, 16777215 | |
| 83 ; (0xFFFFFF) | |
| 84 %a24 = trunc i32 %a to i24 | |
| 85 | |
| 86 ; CHECK: %a24.trunc = trunc i32 %a24 to i16 | |
| 87 ; CHECK-NEXT: %a12 = and i16 %a24.trunc, 4095 | |
| 88 ; (0xFFF) | |
| 89 %a12 = trunc i24 %a24 to i12 | |
| 90 ret void | |
| 91 } | |
| 92 | |
| 93 ; CHECK: @icmpsigned | |
| 94 define void @icmpsigned(i32 %a) { | |
| 95 %shl = trunc i32 %a to i24 | |
| 96 ; CHECK: %shl.getsign = shl i32 %shl, 8 | |
| 97 ; CHECK-NEXT: %shl.signed = ashr i32 %shl.getsign, 8 | |
| 98 ; CHECK-NEXT: %cmp = icmp slt i32 %shl.signed, -2 | |
| 99 %cmp = icmp slt i24 %shl, -2 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
Is it the case that with "ult", you will still end
Derek Schuff
2013/05/08 22:33:28
No, with unsigned and equality we don't sign-exten
| |
| 100 ret void | |
| 101 } | |
| 102 | |
| 103 ; CHECK: @bc1 | |
| 104 ; CHECK: bc1 = bitcast i32* %a to i64* | |
| 105 ; CHECK-NEXT: bc2 = bitcast i64* %bc1 to i32* | |
| 106 define i32* @bc1(i32* %a) { | |
| 107 %bc1 = bitcast i32* %a to i40* | |
| 108 %bc2 = bitcast i40* %bc1 to i32* | |
| 109 ret i32* %bc2 | |
| 110 } | |
| 111 | |
| 112 ; CHECK: zext i32 %a to i64 | |
| 113 ; CHECK: and i64 %a40, 255 | |
| 114 define void @and1(i32 %a) { | |
| 115 %a40 = zext i32 %a to i40 | |
| 116 %and = and i40 %a40, 255 | |
| 117 ret void | |
| 118 } | |
| 119 | |
| 120 ; CHECK: @add1 | |
| 121 ; CHECK: sext i16 %a to i32 | |
| 122 ; CHECK: %sum.result = add i32 %a24, 16777214 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
CHECK-NEXT:
or is there something in between?
Derek Schuff
2013/05/08 22:33:28
Done.
| |
| 123 ; CHECK: %sum = and i32 %sum.result, 16777215 | |
| 124 define void @add1(i16 %a) { | |
| 125 %a24 = sext i16 %a to i24 | |
| 126 %sum = add i24 %a24, -2 | |
| 127 ret void | |
| 128 } | |
| 129 | |
| 130 ; CHECK @shl1 | |
| 131 define void @shl1(i16 %a) { | |
| 132 %a24 = zext i16 %a to i24 | |
| 133 ; CHECK: %ashl.result = shl i32 %a24, 5 | |
| 134 ; CHECK: %ashl = and i32 %ashl.result, 16777215 | |
| 135 %ashl = shl i24 %a24, 5 | |
| 136 ret void | |
| 137 } | |
| 138 | |
| 139 ; CHECK: @lshr1 | |
| 140 define void @lshr1(i16 %a) { | |
| 141 %a24 = zext i16 %a to i24 | |
| 142 ; CHECK: %b = lshr i32 %a24, 20 | |
| 143 %b = lshr i24 %a24, 20 | |
|
jvoung (off chromium)
2013/05/07 01:22:11
nit: Also test with shift amt smaller than 16? (w
Derek Schuff
2013/05/08 22:33:28
True, although it's just an artifact of the way I
| |
| 144 ret void | |
| 145 } | |
| 146 | |
| 147 ; CHECK: @ashr1 | |
| 148 define void @ashr1(i16 %a) { | |
| 149 %a24 = sext i16 %a to i24 | |
| 150 ; CHECK: %a24.getsign = shl i32 %a24, 8 | |
| 151 ; CHECK-NEXT: %b24.result = ashr i32 %a24.getsign, 19 | |
| 152 ; CHECK-NEXT: %b24 = and i32 %b24.result, 16777215 | |
| 153 %b24 = ashr i24 %a24, 11 | |
| 154 ; CHECK-NEXT: %a24.getsign1 = shl i32 %a24, 8 | |
| 155 ; CHECK-NEXT: %a24.shamt = add i32 %b24, 8 | |
| 156 ; CHECK-NEXT: %c.result = ashr i32 %a24.getsign1, %a24.shamt | |
| 157 ; CHECK-NEXT: %c = and i32 %c.result, 16777215 | |
| 158 %c = ashr i24 %a24, %b24 | |
| 159 ret void | |
| 160 } | |
| 161 | |
| 162 ; CHECK: @phi_icmp | |
| 163 define void @phi_icmp(i32 %a) { | |
| 164 entry: | |
| 165 br label %loop | |
| 166 loop: | |
| 167 ; CHECK: %phi40 = phi i64 [ 1099511627774, %entry ], [ %phi40, %loop ] | |
| 168 %phi40 = phi i40 [ -2, %entry ], [ %phi40, %loop ] | |
| 169 ; CHECK-NEXT: %b = icmp eq i64 %phi40, 1099511627775 | |
| 170 %b = icmp eq i40 %phi40, -1 | |
| 171 ; CHECK-NEXT: br i1 %b, label %loop, label %end | |
| 172 br i1 %b, label %loop, label %end | |
| 173 end: | |
| 174 ret void | |
| 175 } | |
| 176 | |
| 177 ; CHECK: @icmp_ult | |
| 178 define void @icmp_ult(i32 %a) { | |
| 179 %a40 = zext i32 %a to i40 | |
| 180 ; CHECK: %b = icmp ult i64 %a40, 1099511627774 | |
| 181 %b = icmp ult i40 %a40, -2 | |
| 182 ret void | |
| 183 } | |
| 184 | |
| 185 ; TODO(dschuff): implement icmp sXX | |
| 186 | |
| 187 ; CHECK: @select1 | |
| 188 define void @select1(i32 %a) { | |
| 189 %a40 = zext i32 %a to i40 | |
| 190 ; CHECK: %s40 = select i1 true, i64 %a40, i64 1099511627775 | |
| 191 %s40 = select i1 true, i40 %a40, i40 -1 | |
| 192 ret void | |
| 193 } | |
| 194 | |
| 195 ; CHECK: @alloca40 | |
| 196 ; CHECK: alloca i64, align 8 | |
| 197 define void @alloca40() { | |
| 198 %a = alloca i40, align 8 | |
| 199 %b = bitcast i40* %a to i8* | |
| 200 %c = load i8* %b | |
| 201 ret void | |
| 202 } | |
| 203 | |
| 204 ; CHECK: @load24 | |
| 205 ; CHECK: %bc.loty = bitcast i32* %bc to i16* | |
| 206 ; CHECK-NEXT: %load.lo = load i16* %bc.loty | |
| 207 ; CHECK-NEXT: %load.lo.ext = zext i16 %load.lo to i32 | |
| 208 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1 | |
| 209 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8* | |
| 210 ; CHECK-NEXT: %load.hi = load i8* %bc.hity | |
| 211 ; CHECK-NEXT: %load.hi.ext = zext i8 %load.hi to i32 | |
| 212 ; CHECK-NEXT: %load.hi.ext.sh = shl i32 %load.hi.ext, 16 | |
| 213 ; CHECK-NEXT: %load = or i32 %load.lo.ext, %load.hi.ext.sh | |
| 214 define void @load24(i8* %a) { | |
| 215 %bc = bitcast i8* %a to i24* | |
|
jvoung (off chromium)
2013/05/07 01:22:11
Is it also possible to handle bitcast i32* %a to i
Derek Schuff
2013/05/08 22:33:28
Yeah, the bitcast is just to get from a legal type
| |
| 216 %load = load i24* %bc, align 8 | |
| 217 ret void | |
| 218 } | |
| 219 | |
| 220 ; CHECK: @load48 | |
| 221 ; CHECK: %bc.loty = bitcast i64* %bc to i32* | |
| 222 ; CHECK-NEXT: %load.lo = load i32* %bc.loty | |
| 223 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64 | |
| 224 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
| 225 ; CHECK-NEXT: %bc.hity = bitcast i32* %bc.hi to i16* | |
| 226 ; CHECK-NEXT: %load.hi = load i16* %bc.hity | |
| 227 ; CHECK-NEXT: %load.hi.ext = zext i16 %load.hi to i64 | |
| 228 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32 | |
| 229 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh | |
| 230 define void @load48(i32* %a) { | |
| 231 %bc = bitcast i32* %a to i48* | |
| 232 %load = load i48* %bc, align 8 | |
| 233 ret void | |
| 234 } | |
| 235 | |
| 236 ; CHECK: %bc = bitcast i32* %a to i64* | |
| 237 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32* | |
| 238 ; CHECK-NEXT: %load.lo = load i32* %bc.loty | |
| 239 ; CHECK-NEXT: %load.lo.ext = zext i32 %load.lo to i64 | |
| 240 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
| 241 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16* | |
| 242 ; CHECK-NEXT: %load.hi.lo = load i16* %bc.hity.loty | |
| 243 ; CHECK-NEXT: %load.hi.lo.ext = zext i16 %load.hi.lo to i32 | |
| 244 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1 | |
| 245 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8* | |
| 246 ; CHECK-NEXT: %load.hi.hi = load i8* %bc.hity.hity | |
| 247 ; CHECK-NEXT: %load.hi.hi.ext = zext i8 %load.hi.hi to i32 | |
| 248 ; CHECK-NEXT: %load.hi.hi.ext.sh = shl i32 %load.hi.hi.ext, 16 | |
| 249 ; CHECK-NEXT: %load.hi = or i32 %load.hi.lo.ext, %load.hi.hi.ext.sh | |
| 250 ; CHECK-NEXT: %load.hi.ext = zext i32 %load.hi to i64 | |
| 251 ; CHECK-NEXT: %load.hi.ext.sh = shl i64 %load.hi.ext, 32 | |
| 252 ; CHECK-NEXT: %load = or i64 %load.lo.ext, %load.hi.ext.sh | |
| 253 define void @load56(i32* %a) { | |
| 254 %bc = bitcast i32* %a to i56* | |
| 255 %load = load i56* %bc | |
| 256 ret void | |
| 257 } | |
| 258 | |
| 259 ; CHECK: @store24 | |
| 260 ; CHECK: %b24 = zext i8 %b to i32 | |
| 261 ; CHECK-NEXT: %bc.loty = bitcast i32* %bc to i16* | |
| 262 ; CHECK-NEXT: %b24.lo = trunc i32 %b24 to i16 | |
| 263 ; CHECK-NEXT: store i16 %b24.lo, i16* %bc.loty | |
| 264 ; CHECK-NEXT: %b24.hi.sh = lshr i32 %b24, 16 | |
| 265 ; CHECK-NEXT: %bc.hi = getelementptr i16* %bc.loty, i32 1 | |
| 266 ; CHECK-NEXT: %b24.hi = trunc i32 %b24.hi.sh to i8 | |
| 267 ; CHECK-NEXT: %bc.hity = bitcast i16* %bc.hi to i8* | |
| 268 ; CHECK-NEXT: store i8 %b24.hi, i8* %bc.hity | |
| 269 define void @store24(i8* %a, i8 %b) { | |
| 270 %bc = bitcast i8* %a to i24* | |
| 271 %b24 = zext i8 %b to i24 | |
| 272 store i24 %b24, i24* %bc | |
| 273 ret void | |
| 274 } | |
| 275 | |
| 276 ; CHECK: @store56 | |
| 277 ; CHECK: %b56 = zext i8 %b to i64 | |
| 278 ; CHECK-NEXT: %bc.loty = bitcast i64* %bc to i32* | |
| 279 ; CHECK-NEXT: %b56.lo = trunc i64 %b56 to i32 | |
| 280 ; CHECK-NEXT: store i32 %b56.lo, i32* %bc.loty | |
| 281 ; CHECK-NEXT: %b56.hi.sh = lshr i64 %b56, 32 | |
| 282 ; CHECK-NEXT: %bc.hi = getelementptr i32* %bc.loty, i32 1 | |
| 283 ; CHECK-NEXT: %bc.hity.loty = bitcast i32* %bc.hi to i16* | |
| 284 ; CHECK-NEXT: %b56.hi.sh.lo = trunc i64 %b56.hi.sh to i16 | |
| 285 ; CHECK-NEXT: store i16 %b56.hi.sh.lo, i16* %bc.hity.loty | |
| 286 ; CHECK-NEXT: %b56.hi.sh.hi.sh = lshr i64 %b56.hi.sh, 16 | |
| 287 ; CHECK-NEXT: %bc.hity.hi = getelementptr i16* %bc.hity.loty, i32 1 | |
| 288 ; CHECK-NEXT: %b56.hi.sh.hi = trunc i64 %b56.hi.sh.hi.sh to i8 | |
| 289 ; CHECK-NEXT: %bc.hity.hity = bitcast i16* %bc.hity.hi to i8* | |
| 290 ; CHECK-NEXT: store i8 %b56.hi.sh.hi, i8* %bc.hity.hity | |
| 291 define void @store56(i8* %a, i8 %b) { | |
| 292 %bc = bitcast i8* %a to i56* | |
| 293 %b56 = zext i8 %b to i56 | |
| 294 store i56 %b56, i56* %bc | |
| 295 ret void | |
| 296 } | |
| OLD | NEW |