Home | History | Annotate | Download | only in llvm2ice_tests
      1 ; This tries to be a comprehensive test of i8 operations.
      2 
      3 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \
      4 ; RUN:   -allow-externally-defined-symbols | FileCheck %s
      5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \
      6 ; RUN:   -allow-externally-defined-symbols | FileCheck %s
      7 
      8 ; The following tests i8 srem/urem lowering on x86-64, specifically that the %ah
      9 ; result gets copied into %al/%bl/%cl/%dl before moved into its final register.
     10 ; This extra copy is forced by excluding al/bl/cl/dl by default (-reg-exclude),
     11 ; but allowing them to be used if absolutely necessary (-reg-reserve).
     12 
     13 ; RUN: %p2i --target=x8664 --filetype=obj --disassemble -i %s --args -O2 \
     14 ; RUN:   -reg-exclude=al,bl,cl,dl -reg-reserve \
     15 ; RUN:   -allow-externally-defined-symbols | FileCheck %s --check-prefix=REM
     16 
     17 ; RUN: %if --need=target_MIPS32 --need=allow_dump \
     18 ; RUN:   --command %p2i --filetype=asm --assemble --disassemble --target \
     19 ; RUN:   mips32 -i %s --args -O2 -allow-externally-defined-symbols \
     20 ; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
     21 ; RUN:   --command FileCheck --check-prefix MIPS32 %s
     22 
     23 declare void @useInt(i32 %x)
     24 
     25 define internal i32 @add8Bit(i32 %a, i32 %b) {
     26 entry:
     27   %a_8 = trunc i32 %a to i8
     28   %b_8 = trunc i32 %b to i8
     29   %add = add i8 %b_8, %a_8
     30   %ret = zext i8 %add to i32
     31   ret i32 %ret
     32 }
     33 ; CHECK-LABEL: add8Bit
     34 ; CHECK: add {{[abcd]l}}
     35 ; MIPS32-LABEL: add8Bit
     36 ; MIPS32: 	addu
     37 ; MIPS32: 	andi	{{.*}},0xff
     38 ; MIPS32: 	move
     39 ; MIPS32: 	jr
     40 ; MIPS32: 	nop
     41 
     42 define internal i32 @add8BitConst(i32 %a) {
     43 entry:
     44   %a_8 = trunc i32 %a to i8
     45   %add = add i8 %a_8, 123
     46   %ret = zext i8 %add to i32
     47   ret i32 %ret
     48 }
     49 ; CHECK-LABEL: add8BitConst
     50 ; CHECK: add {{[abcd]l}}
     51 ; MIPS32-LABEL: add8BitConst
     52 ; MIPS32: 	addiu
     53 ; MIPS32: 	andi	{{.*}},0xff
     54 ; MIPS32: 	move
     55 ; MIPS32: 	jr
     56 ; MIPS32: 	nop
     57 
     58 define internal i32 @sub8Bit(i32 %a, i32 %b) {
     59 entry:
     60   %a_8 = trunc i32 %a to i8
     61   %b_8 = trunc i32 %b to i8
     62   %sub = sub i8 %b_8, %a_8
     63   %ret = zext i8 %sub to i32
     64   ret i32 %ret
     65 }
     66 ; CHECK-LABEL: sub8Bit
     67 ; CHECK: sub {{[abcd]l}}
     68 ; MIPS32-LABEL: sub8Bit
     69 ; MIPS32: 	subu
     70 ; MIPS32: 	andi	{{.*}},0xff
     71 ; MIPS32: 	move
     72 ; MIPS32: 	jr
     73 ; MIPS32: 	nop
     74 
     75 define internal i32 @sub8BitConst(i32 %a) {
     76 entry:
     77   %a_8 = trunc i32 %a to i8
     78   %sub = sub i8 %a_8, 123
     79   %ret = zext i8 %sub to i32
     80   ret i32 %ret
     81 }
     82 ; CHECK-LABEL: sub8BitConst
     83 ; CHECK: sub {{[abcd]l}}
     84 ; MIPS32-LABEL: sub8BitConst
     85 ; MIPS32: 	addiu   {{.*}},-123
     86 ; MIPS32: 	andi	{{.*}},0xff
     87 ; MIPS32: 	move
     88 ; MIPS32: 	jr
     89 ; MIPS32: 	nop
     90 
     91 define internal i32 @mul8Bit(i32 %a, i32 %b) {
     92 entry:
     93   %a_8 = trunc i32 %a to i8
     94   %b_8 = trunc i32 %b to i8
     95   %mul = mul i8 %b_8, %a_8
     96   %ret = zext i8 %mul to i32
     97   ret i32 %ret
     98 }
     99 ; CHECK-LABEL: mul8Bit
    100 ; CHECK: mul {{[abcd]l|BYTE PTR}}
    101 ; MIPS32-LABEL: mul8Bit
    102 ; MIPS32: 	mul
    103 ; MIPS32: 	andi	{{.*}},0xff
    104 ; MIPS32: 	move
    105 ; MIPS32: 	jr
    106 ; MIPS32: 	nop
    107 
    108 define internal i32 @mul8BitConst(i32 %a) {
    109 entry:
    110   %a_8 = trunc i32 %a to i8
    111   %mul = mul i8 %a_8, 56
    112   %ret = zext i8 %mul to i32
    113   ret i32 %ret
    114 }
    115 ; CHECK-LABEL: mul8BitConst
    116 ; 8-bit imul only accepts r/m, not imm
    117 ; CHECK: mov {{.*}},0x38
    118 ; CHECK: mul {{[abcd]l|BYTE PTR}}
    119 ; MIPS32-LABEL: mul8BitConst
    120 ; MIPS32: 	li
    121 ; MIPS32: 	mul
    122 ; MIPS32: 	andi	{{.*}},0xff
    123 ; MIPS32: 	move
    124 ; MIPS32: 	jr
    125 ; MIPS32: 	nop
    126 
    127 define internal i32 @udiv8Bit(i32 %a, i32 %b) {
    128 entry:
    129   %a_8 = trunc i32 %a to i8
    130   %b_8 = trunc i32 %b to i8
    131   %udiv = udiv i8 %b_8, %a_8
    132   %ret = zext i8 %udiv to i32
    133   ret i32 %ret
    134 }
    135 ; CHECK-LABEL: udiv8Bit
    136 ; CHECK: div {{[abcd]l|BYTE PTR}}
    137 ; MIPS32-LABEL: udiv8Bit
    138 ; MIPS32: 	divu
    139 ; MIPS32: 	teq
    140 ; MIPS32: 	mflo
    141 ; MIPS32: 	andi	{{.*}},0xff
    142 ; MIPS32: 	jr
    143 ; MIPS32: 	nop
    144 
    145 define internal i32 @udiv8BitConst(i32 %a) {
    146 entry:
    147   %a_8 = trunc i32 %a to i8
    148   %udiv = udiv i8 %a_8, 123
    149   %ret = zext i8 %udiv to i32
    150   ret i32 %ret
    151 }
    152 ; CHECK-LABEL: udiv8BitConst
    153 ; CHECK: div {{[abcd]l|BYTE PTR}}
    154 ; MIPS32-LABEL: udiv8BitConst
    155 ; MIPS32: 	li
    156 ; MIPS32: 	divu
    157 ; MIPS32: 	teq
    158 ; MIPS32: 	mflo
    159 ; MIPS32: 	andi	{{.*}},0xff
    160 ; MIPS32: 	jr
    161 ; MIPS32: 	nop
    162 
    163 define internal i32 @urem8Bit(i32 %a, i32 %b) {
    164 entry:
    165   %a_8 = trunc i32 %a to i8
    166   %b_8 = trunc i32 %b to i8
    167   %urem = urem i8 %b_8, %a_8
    168   %ret = zext i8 %urem to i32
    169   ret i32 %ret
    170 }
    171 ; CHECK-LABEL: urem8Bit
    172 ; CHECK: div {{[abcd]l|BYTE PTR}}
    173 ; REM-LABEL: urem8Bit
    174 ; REM: div
    175 ; REM-NEXT: mov {{[abcd]}}l,ah
    176 ; MIPS32-LABEL: urem8Bit
    177 ; MIPS32: 	divu
    178 ; MIPS32: 	teq
    179 ; MIPS32: 	mfhi
    180 ; MIPS32: 	andi	{{.*}},0xff
    181 ; MIPS32: 	jr
    182 ; MIPS32: 	nop
    183 
    184 define internal i32 @urem8BitConst(i32 %a) {
    185 entry:
    186   %a_8 = trunc i32 %a to i8
    187   %urem = urem i8 %a_8, 123
    188   %ret = zext i8 %urem to i32
    189   ret i32 %ret
    190 }
    191 ; CHECK-LABEL: urem8BitConst
    192 ; CHECK: div {{[abcd]l|BYTE PTR}}
    193 ; REM-LABEL: urem8BitConst
    194 ; MIPS32-LABEL: urem8BitConst
    195 ; MIPS32: 	li
    196 ; MIPS32: 	divu
    197 ; MIPS32: 	teq
    198 ; MIPS32: 	mfhi
    199 ; MIPS32: 	andi	{{.*}},0xff
    200 ; MIPS32: 	jr
    201 ; MIPS32: 	nop
    202 
    203 
    204 define internal i32 @sdiv8Bit(i32 %a, i32 %b) {
    205 entry:
    206   %a_8 = trunc i32 %a to i8
    207   %b_8 = trunc i32 %b to i8
    208   %sdiv = sdiv i8 %b_8, %a_8
    209   %ret = zext i8 %sdiv to i32
    210   ret i32 %ret
    211 }
    212 ; CHECK-LABEL: sdiv8Bit
    213 ; CHECK: idiv {{[abcd]l|BYTE PTR}}
    214 ; MIPS32-LABEL: sdiv8Bit
    215 ; MIPS32: 	div
    216 ; MIPS32: 	teq
    217 ; MIPS32: 	mflo
    218 ; MIPS32: 	andi	{{.*}},0xff
    219 ; MIPS32: 	jr
    220 ; MIPS32: 	nop
    221 
    222 define internal i32 @sdiv8BitConst(i32 %a) {
    223 entry:
    224   %a_8 = trunc i32 %a to i8
    225   %sdiv = sdiv i8 %a_8, 123
    226   %ret = zext i8 %sdiv to i32
    227   ret i32 %ret
    228 }
    229 ; CHECK-LABEL: sdiv8BitConst
    230 ; CHECK: idiv {{[abcd]l|BYTE PTR}}
    231 ; MIPS32-LABEL: sdiv8BitConst
    232 ; MIPS32: 	li
    233 ; MIPS32: 	div
    234 ; MIPS32: 	teq
    235 ; MIPS32: 	mflo
    236 ; MIPS32: 	andi	{{.*}},0xff
    237 ; MIPS32: 	jr
    238 ; MIPS32: 	nop
    239 
    240 define internal i32 @srem8Bit(i32 %a, i32 %b) {
    241 entry:
    242   %a_8 = trunc i32 %a to i8
    243   %b_8 = trunc i32 %b to i8
    244   %srem = srem i8 %b_8, %a_8
    245   %ret = zext i8 %srem to i32
    246   ret i32 %ret
    247 }
    248 ; CHECK-LABEL: srem8Bit
    249 ; CHECK: idiv {{[abcd]l|BYTE PTR}}
    250 ; REM-LABEL: srem8Bit
    251 ; REM: idiv
    252 ; REM-NEXT: mov {{[abcd]}}l,ah
    253 ; MIPS32-LABEL: srem8Bit
    254 ; MIPS32: 	div
    255 ; MIPS32: 	teq
    256 ; MIPS32: 	mfhi
    257 ; MIPS32: 	andi	{{.*}},0xff
    258 ; MIPS32: 	jr
    259 ; MIPS32: 	nop
    260 
    261 define internal i32 @srem8BitConst(i32 %a) {
    262 entry:
    263   %a_8 = trunc i32 %a to i8
    264   %srem = srem i8 %a_8, 123
    265   %ret = zext i8 %srem to i32
    266   ret i32 %ret
    267 }
    268 ; CHECK-LABEL: srem8BitConst
    269 ; CHECK: idiv {{[abcd]l|BYTE PTR}}
    270 ; REM-LABEL: srem8BitConst
    271 ; MIPS32-LABEL: srem8BitConst
    272 ; MIPS32: 	li
    273 ; MIPS32: 	div
    274 ; MIPS32: 	teq
    275 ; MIPS32: 	mfhi
    276 ; MIPS32: 	andi	{{.*}},0xff
    277 ; MIPS32: 	jr
    278 ; MIPS32: 	nop
    279 
    280 define internal i32 @shl8Bit(i32 %a, i32 %b) {
    281 entry:
    282   %a_8 = trunc i32 %a to i8
    283   %b_8 = trunc i32 %b to i8
    284   %shl = shl i8 %b_8, %a_8
    285   %ret = zext i8 %shl to i32
    286   ret i32 %ret
    287 }
    288 ; CHECK-LABEL: shl8Bit
    289 ; CHECK: shl {{[abd]l|BYTE PTR}},cl
    290 ; MIPS32-LABEL: shl8Bit
    291 ; MIPS32: 	sllv
    292 ; MIPS32: 	andi	{{.*}},0xff
    293 ; MIPS32: 	move
    294 ; MIPS32: 	jr
    295 ; MIPS32: 	nop
    296 
    297 define internal i32 @shl8BitConst(i32 %a, i32 %b) {
    298 entry:
    299   %a_8 = trunc i32 %a to i8
    300   %shl = shl i8 %a_8, 6
    301   %ret = zext i8 %shl to i32
    302   ret i32 %ret
    303 }
    304 ; CHECK-LABEL: shl8BitConst
    305 ; CHECK: shl {{[abcd]l|BYTE PTR}},0x6
    306 ; MIPS32-LABEL: shl8BitConst
    307 ; MIPS32: 	sll
    308 ; MIPS32: 	andi	{{.*}},0xff
    309 ; MIPS32: 	move
    310 ; MIPS32: 	jr
    311 ; MIPS32: 	nop
    312 
    313 define internal i32 @lshr8Bit(i32 %a, i32 %b) {
    314 entry:
    315   %a_8 = trunc i32 %a to i8
    316   %b_8 = trunc i32 %b to i8
    317   %lshr = lshr i8 %b_8, %a_8
    318   %ret = zext i8 %lshr to i32
    319   ret i32 %ret
    320 }
    321 ; CHECK-LABEL: lshr8Bit
    322 ; CHECK: shr {{[abd]l|BYTE PTR}},cl
    323 ; MIPS32-LABEL: lshr8Bit
    324 ; MIPS32: 	srlv
    325 ; MIPS32: 	andi	{{.*}},0xff
    326 ; MIPS32: 	move
    327 ; MIPS32: 	jr
    328 ; MIPS32: 	nop
    329 
    330 define internal i32 @lshr8BitConst(i32 %a, i32 %b) {
    331 entry:
    332   %a_8 = trunc i32 %a to i8
    333   %lshr = lshr i8 %a_8, 6
    334   %ret = zext i8 %lshr to i32
    335   ret i32 %ret
    336 }
    337 ; CHECK-LABEL: lshr8BitConst
    338 ; CHECK: shr {{[abcd]l|BYTE PTR}},0x6
    339 ; MIPS32-LABEL: lshr8BitConst
    340 ; MIPS32: 	srl
    341 ; MIPS32: 	andi	{{.*}},0xff
    342 ; MIPS32: 	move
    343 ; MIPS32: 	jr
    344 ; MIPS32: 	nop
    345 
    346 define internal i32 @ashr8Bit(i32 %a, i32 %b) {
    347 entry:
    348   %a_8 = trunc i32 %a to i8
    349   %b_8 = trunc i32 %b to i8
    350   %ashr = ashr i8 %b_8, %a_8
    351   %ret = zext i8 %ashr to i32
    352   ret i32 %ret
    353 }
    354 ; CHECK-LABEL: ashr8Bit
    355 ; CHECK: sar {{[abd]l|BYTE PTR}},cl
    356 ; MIPS32-LABEL: ashr8Bit
    357 ; MIPS32: 	sra
    358 ; MIPS32: 	andi	{{.*}},0xff
    359 ; MIPS32: 	move
    360 ; MIPS32: 	jr
    361 ; MIPS32: 	nop
    362 
    363 define internal i32 @ashr8BitConst(i32 %a, i32 %b) {
    364 entry:
    365   %a_8 = trunc i32 %a to i8
    366   %ashr = ashr i8 %a_8, 6
    367   %ret = zext i8 %ashr to i32
    368   ret i32 %ret
    369 }
    370 ; CHECK-LABEL: ashr8BitConst
    371 ; CHECK: sar {{[abcd]l|BYTE PTR}},0x6
    372 ; MIPS32-LABEL: ashr8BitConst
    373 ; MIPS32: 	sra
    374 ; MIPS32: 	andi	{{.*}},0xff
    375 ; MIPS32: 	move
    376 ; MIPS32: 	jr
    377 ; MIPS32: 	nop
    378 
    379 define internal i32 @icmp8Bit(i32 %a, i32 %b) {
    380 entry:
    381   %a_8 = trunc i32 %a to i8
    382   %b_8 = trunc i32 %b to i8
    383   %icmp = icmp ne i8 %b_8, %a_8
    384   %ret = zext i1 %icmp to i32
    385   ret i32 %ret
    386 }
    387 ; CHECK-LABEL: icmp8Bit
    388 ; CHECK: cmp {{[abcd]l|BYTE PTR}}
    389 ; MIPS32-LABEL: icmp8Bit
    390 ; MIPS32: 	sll	{{.*}},0x18
    391 ; MIPS32: 	sll	{{.*}},0x18
    392 ; MIPS32: 	xor
    393 ; MIPS32: 	sltu
    394 ; MIPS32: 	andi	{{.*}},0x1
    395 ; MIPS32: 	move
    396 ; MIPS32: 	jr
    397 ; MIPS32: 	nop
    398 
    399 define internal i32 @icmp8BitConst(i32 %a) {
    400 entry:
    401   %a_8 = trunc i32 %a to i8
    402   %icmp = icmp ne i8 %a_8, 123
    403   %ret = zext i1 %icmp to i32
    404   ret i32 %ret
    405 }
    406 ; CHECK-LABEL: icmp8BitConst
    407 ; CHECK: cmp {{[abcd]l|BYTE PTR}}
    408 ; MIPS32-LABEL: icmp8BitConst
    409 ; MIPS32: 	li
    410 ; MIPS32: 	sll	{{.*}},0x18
    411 ; MIPS32: 	sll	{{.*}},0x18
    412 ; MIPS32: 	xor
    413 ; MIPS32: 	sltu
    414 ; MIPS32: 	andi	{{.*}},0x1
    415 ; MIPS32: 	move
    416 ; MIPS32: 	jr
    417 ; MIPS32: 	nop
    418 
    419 define internal i32 @icmp8BitConstSwapped(i32 %a) {
    420 entry:
    421   %a_8 = trunc i32 %a to i8
    422   %icmp = icmp ne i8 123, %a_8
    423   %ret = zext i1 %icmp to i32
    424   ret i32 %ret
    425 }
    426 ; CHECK-LABEL: icmp8BitConstSwapped
    427 ; CHECK: cmp {{[abcd]l|BYTE PTR}}
    428 ; MIPS32-LABEL: icmp8BitConstSwapped
    429 ; MIPS32: 	li
    430 ; MIPS32: 	sll	{{.*}},0x18
    431 ; MIPS32: 	sll	{{.*}},0x18
    432 ; MIPS32: 	xor	v0,v0,a0
    433 ; MIPS32: 	sltu
    434 ; MIPS32: 	andi	{{.*}},0x1
    435 ; MIPS32: 	jr
    436 ; MIPS32: 	nop
    437 
    438 define internal i32 @icmp8BitMem(i32 %a, i32 %b_iptr) {
    439 entry:
    440   %a_8 = trunc i32 %a to i8
    441   %bptr = inttoptr i32 %b_iptr to i8*
    442   %b_8 = load i8, i8* %bptr, align 1
    443   %icmp = icmp ne i8 %b_8, %a_8
    444   %ret = zext i1 %icmp to i32
    445   ret i32 %ret
    446 }
    447 ; CHECK-LABEL: icmp8BitMem
    448 ; CHECK: cmp {{[abcd]l|BYTE PTR}}
    449 ; MIPS32-LABEL: icmp8BitMem
    450 ; MIPS32: 	lb
    451 ; MIPS32: 	sll	{{.*}},0x18
    452 ; MIPS32: 	sll	{{.*}},0x18
    453 ; MIPS32: 	xor
    454 ; MIPS32: 	sltu
    455 ; MIPS32: 	andi	{{.*}},0x1
    456 ; MIPS32: 	move
    457 ; MIPS32: 	jr
    458 ; MIPS32: 	nop
    459 
    460 define internal i32 @icmp8BitMemSwapped(i32 %a, i32 %b_iptr) {
    461 entry:
    462   %a_8 = trunc i32 %a to i8
    463   %bptr = inttoptr i32 %b_iptr to i8*
    464   %b_8 = load i8, i8* %bptr, align 1
    465   %icmp = icmp ne i8 %a_8, %b_8
    466   %ret = zext i1 %icmp to i32
    467   ret i32 %ret
    468 }
    469 ; CHECK-LABEL: icmp8BitMemSwapped
    470 ; CHECK: cmp {{[abcd]l|BYTE PTR}}
    471 ; MIPS32-LABEL: icmp8BitMemSwapped
    472 ; MIPS32: 	lb
    473 ; MIPS32: 	sll	{{.*}},0x18
    474 ; MIPS32: 	sll	{{.*}},0x18
    475 ; MIPS32: 	xor
    476 ; MIPS32: 	sltu
    477 ; MIPS32: 	andi	{{.*}},0x1
    478 ; MIPS32: 	move
    479 ; MIPS32: 	jr
    480 ; MIPS32: 	nop
    481 
    482 define internal i32 @selectI8Var(i32 %a, i32 %b) {
    483 entry:
    484   %a_8 = trunc i32 %a to i8
    485   %b_8 = trunc i32 %b to i8
    486   %cmp = icmp slt i8 %a_8, %b_8
    487   %ret = select i1 %cmp, i8 %a_8, i8 %b_8
    488   %ret_ext = zext i8 %ret to i32
    489   ; Create a "fake" use of %cmp to prevent O2 bool folding.
    490   %d1 = zext i1 %cmp to i32
    491   call void @useInt(i32 %d1)
    492   ret i32 %ret_ext
    493 }
    494 ; CHECK-LABEL: selectI8Var
    495 ; CHECK: cmp
    496 ; CHECK: setl
    497 ; CHECK: mov {{[a-d]l}}
    498 ; MIPS32-LABEL: selectI8Var
    499 ; MIPS32: 	addiu
    500 ; MIPS32: 	sw
    501 ; MIPS32: 	sw
    502 ; MIPS32: 	move
    503 ; MIPS32: 	move
    504 ; MIPS32: 	sll	{{.*}},0x18
    505 ; MIPS32: 	sll	{{.*}},0x18
    506 ; MIPS32: 	slt
    507 ; MIPS32: 	move
    508 ; MIPS32: 	movn
    509 ; MIPS32: 	andi	{{.*}},0xff
    510 ; MIPS32: 	move
    511 ; MIPS32: 	andi	{{.*}},0x1
    512 ; MIPS32: 	move
    513 ; MIPS32: 	jal
    514 ; MIPS32: 	nop
    515 ; MIPS32: 	move
    516 ; MIPS32: 	lw
    517 ; MIPS32: 	lw
    518 ; MIPS32: 	addiu
    519 ; MIPS32: 	jr
    520 ; MIPS32: 	nop
    521 
    522 define internal i32 @testPhi8(i32 %arg, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7, i32 %arg8, i32 %arg9, i32 %arg10) {
    523 entry:
    524   %trunc = trunc i32 %arg to i8
    525   %trunc2 = trunc i32 %arg2 to i8
    526   %trunc3 = trunc i32 %arg3 to i8
    527   %trunc4 = trunc i32 %arg4 to i8
    528   %trunc5 = trunc i32 %arg5 to i8
    529   %cmp1 = icmp sgt i32 %arg, 0
    530   br i1 %cmp1, label %next, label %target
    531 next:
    532   %trunc6_16 = trunc i32 %arg6 to i16
    533   %trunc7_16 = trunc i32 %arg7 to i16
    534   %trunc8_16 = trunc i32 %arg8 to i16
    535   %trunc9 = trunc i32 %arg9 to i8
    536   %trunc10 = trunc i32 %arg10 to i8
    537   %trunc7_8 = trunc i16 %trunc7_16 to i8
    538   %trunc6_8 = trunc i16 %trunc6_16 to i8
    539   %trunc8_8 = trunc i16 %trunc8_16 to i8
    540   br label %target
    541 target:
    542   %merge1 = phi i1 [ %cmp1, %entry ], [ false, %next ]
    543   %merge2 = phi i8 [ %trunc, %entry ], [ %trunc6_8, %next ]
    544   %merge3 = phi i8 [ %trunc2, %entry ], [ %trunc7_8, %next ]
    545   %merge5 = phi i8 [ %trunc4, %entry ], [ %trunc9, %next ]
    546   %merge6 = phi i8 [ %trunc5, %entry ], [ %trunc10, %next ]
    547   %merge4 = phi i8 [ %trunc3, %entry ], [ %trunc8_8, %next ]
    548   %res1 = select i1 %merge1, i8 %merge2, i8 %merge3
    549   %res2 = select i1 %merge1, i8 %merge4, i8 %merge5
    550   %res1_2 = select i1 %merge1, i8 %res1, i8 %res2
    551   %res123 = select i1 %merge1, i8 %merge6, i8 %res1_2
    552   %result = zext i8 %res123 to i32
    553   ret i32 %result
    554 }
    555 ; CHECK-LABEL: testPhi8
    556 ; This assumes there will be some copy from an 8-bit register / stack slot.
    557 ; CHECK-DAG: mov {{.*}},{{[a-d]}}l
    558 ; CHECK-DAG: mov {{.*}},BYTE PTR
    559 ; CHECK-DAG: mov BYTE PTR {{.*}}
    560 
    561 @global8 = internal global [1 x i8] c"\01", align 4
    562 
    563 define i32 @load_i8(i32 %addr_arg) {
    564 entry:
    565   %addr = inttoptr i32 %addr_arg to i8*
    566   %ret = load i8, i8* %addr, align 1
    567   %ret2 = sub i8 %ret, 0
    568   %ret_ext = zext i8 %ret2 to i32
    569   ret i32 %ret_ext
    570 }
    571 ; CHECK-LABEL: load_i8
    572 ; CHECK: mov {{[a-d]l}},BYTE PTR
    573 ; MIPS32-LABEL: load_i8
    574 ; MIPS32: 	lb
    575 ; MIPS32: 	addiu	{{.*}},0
    576 ; MIPS32: 	andi	{{.*}},0xff
    577 ; MIPS32: 	move
    578 ; MIPS32: 	jr
    579 ; MIPS32: 	nop
    580 
    581 define i32 @load_i8_global(i32 %addr_arg) {
    582 entry:
    583   %addr = bitcast [1 x i8]* @global8 to i8*
    584   %ret = load i8, i8* %addr, align 1
    585   %ret2 = sub i8 %ret, 0
    586   %ret_ext = zext i8 %ret2 to i32
    587   ret i32 %ret_ext
    588 }
    589 ; CHECK-LABEL: load_i8_global
    590 ; CHECK: mov {{[a-d]l}},{{(BYTE PTR)?}}
    591 ; MIPS32-LABEL: load_i8_global
    592 ; MIPS32: 	lui
    593 ; MIPS32: 	addiu
    594 ; MIPS32: 	lb
    595 ; MIPS32: 	addiu	{{.*}},0
    596 ; MIPS32: 	andi	{{.*}},0xff
    597 ; MIPS32: 	jr
    598 ; MIPS32: 	nop
    599 
    600 define void @store_i8(i32 %addr_arg, i32 %val) {
    601 entry:
    602   %val_trunc = trunc i32 %val to i8
    603   %addr = inttoptr i32 %addr_arg to i8*
    604   store i8 %val_trunc, i8* %addr, align 1
    605   ret void
    606 }
    607 ; CHECK-LABEL: store_i8
    608 ; CHECK: mov BYTE PTR {{.*}},{{[a-d]l}}
    609 ; MIPS32-LABEL: store_i8
    610 ; MIPS32: 	sb
    611 ; MIPS32: 	jr
    612 ; MIPS32: 	nop
    613 
    614 define void @store_i8_const(i32 %addr_arg) {
    615 entry:
    616   %addr = inttoptr i32 %addr_arg to i8*
    617   store i8 123, i8* %addr, align 1
    618   ret void
    619 }
    620 ; CHECK-LABEL: store_i8_const
    621 ; CHECK: mov BYTE PTR {{.*}},0x7b
    622 ; MIPS32-LABEL: store_i8_const
    623 ; MIPS32: 	li
    624 ; MIPS32: 	sb
    625 ; MIPS32: 	jr
    626 ; MIPS32: 	nop
    627