[GISel][ARM]: Fix illegal Generic copies in tests

This is in preparation for a verifier check that makes sure
copies are of the same size (when generic virtual registers are involved).

llvm-svn: 316388
This commit is contained in:
Aditya Nandakumar 2017-10-23 22:53:08 +00:00
parent 4dfd2590dc
commit 921f24cef1
4 changed files with 460 additions and 305 deletions

View File

@ -1,13 +1,11 @@
# RUN: llc -O0 -mtriple arm-- -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
--- |
define void @test_zext_s1() { ret void }
define void @test_sext_s1() { ret void }
define void @test_sext_s8() { ret void }
define void @test_zext_s16() { ret void }
define void @test_anyext_s8() { ret void }
define void @test_anyext_s16() { ret void }
define void @test_trunc_s32_16() { ret void }
define void @test_trunc_and_zext_s1() { ret void }
define void @test_trunc_and_sext_s1() { ret void }
define void @test_trunc_and_sext_s8() { ret void }
define void @test_trunc_and_zext_s16() { ret void }
define void @test_trunc_and_anyext_s8() { ret void }
define void @test_trunc_and_anyext_s16() { ret void }
define void @test_add_s32() { ret void }
@ -52,34 +50,8 @@
attributes #2 = { "target-features"="+hwdiv-arm" }
...
---
name: test_zext_s1
# CHECK-LABEL: name: test_zext_s1
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s1) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%1(s32) = G_ZEXT %0(s1)
; CHECK: [[VREGEXT:%[0-9]+]] = ANDri [[VREGX]], 1, 14, _, _
%r0 = COPY %1(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_sext_s1
# CHECK-LABEL: name: test_sext_s1
name: test_trunc_and_zext_s1
# CHECK-LABEL: name: test_trunc_and_zext_s1
legalized: true
regBankSelected: true
selected: false
@ -92,22 +64,24 @@ body: |
bb.0:
liveins: %r0
%0(s1) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%0(s32) = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s32) = G_SEXT %0(s1)
; CHECK: [[VREGAND:%[0-9]+]] = ANDri [[VREGX]], 1, 14, _, _
; CHECK: [[VREGEXT:%[0-9]+]] = RSBri [[VREGAND]], 0, 14, _, _
%1(s1) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%r0 = COPY %1(s32)
%2(s32) = G_ZEXT %1(s1)
; CHECK: [[VREGEXT:%[0-9]+]] = ANDri [[VREGTRUNC]], 1, 14, _, _
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_sext_s8
# CHECK-LABEL: name: test_sext_s8
name: test_trunc_and_sext_s1
# CHECK-LABEL: name: test_trunc_and_sext_s1
legalized: true
regBankSelected: true
selected: false
@ -115,124 +89,143 @@ selected: false
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s8) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%1(s32) = G_SEXT %0(s8)
; CHECK: [[VREGEXT:%[0-9]+]] = SXTB [[VREGX]], 0, 14, _
%r0 = COPY %1(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_zext_s16
# CHECK-LABEL: name: test_zext_s16
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s16) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%1(s32) = G_ZEXT %0(s16)
; CHECK: [[VREGEXT:%[0-9]+]] = UXTH [[VREGX]], 0, 14, _
%r0 = COPY %1(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_anyext_s8
# CHECK-LABEL: name: test_anyext_s8
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s8) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%1(s32) = G_ANYEXT %0(s8)
; CHECK: [[VREGEXT:%[0-9]+]] = COPY [[VREGX]]
%r0 = COPY %1(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_anyext_s16
# CHECK-LABEL: name: test_anyext_s16
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s16) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
%1(s32) = G_ANYEXT %0(s16)
; CHECK: [[VREGEXT:%[0-9]+]] = COPY [[VREGX]]
%r0 = COPY %1(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_trunc_s32_16
# CHECK-LABEL: name: test_trunc_s32_16
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
# CHECK-DAG: id: 0, class: gpr
# CHECK-DAG: id: 1, class: gpr
- { id: 2, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s32) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s1) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%2(s32) = G_SEXT %1(s1)
; CHECK: [[VREGAND:%[0-9]+]] = ANDri [[VREGTRUNC]], 1, 14, _, _
; CHECK: [[VREGEXT:%[0-9]+]] = RSBri [[VREGAND]], 0, 14, _, _
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_trunc_and_sext_s8
# CHECK-LABEL: name: test_trunc_and_sext_s8
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
- { id: 2, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s32) = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s8) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%2(s32) = G_SEXT %1(s8)
; CHECK: [[VREGEXT:%[0-9]+]] = SXTB [[VREGTRUNC]], 0, 14, _
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_trunc_and_zext_s16
# CHECK-LABEL: name: test_trunc_and_zext_s16
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
- { id: 2, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s32) = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s16) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREGX]]
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%r0 = COPY %1(s16)
; CHECK: %r0 = COPY [[VREGTRUNC]]
%2(s32) = G_ZEXT %1(s16)
; CHECK: [[VREGEXT:%[0-9]+]] = UXTH [[VREGTRUNC]], 0, 14, _
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_trunc_and_anyext_s8
# CHECK-LABEL: name: test_trunc_and_anyext_s8
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
- { id: 2, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s32) = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s8) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%2(s32) = G_ANYEXT %1(s8)
; CHECK: [[VREGEXT:%[0-9]+]] = COPY [[VREGTRUNC]]
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
...
---
name: test_trunc_and_anyext_s16
# CHECK-LABEL: name: test_trunc_and_anyext_s16
legalized: true
regBankSelected: true
selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
- { id: 2, class: gprb }
body: |
bb.0:
liveins: %r0
%0(s32) = COPY %r0
; CHECK: [[VREG:%[0-9]+]] = COPY %r0
%1(s16) = G_TRUNC %0(s32)
; CHECK: [[VREGTRUNC:%[0-9]+]] = COPY [[VREG]]
%2(s32) = G_ANYEXT %1(s16)
; CHECK: [[VREGEXT:%[0-9]+]] = COPY [[VREGTRUNC]]
%r0 = COPY %2(s32)
; CHECK: %r0 = COPY [[VREGEXT]]
BX_RET 14, _, implicit %r0
; CHECK: BX_RET 14, _, implicit %r0
@ -711,10 +704,12 @@ registers:
- { id: 1, class: gprb }
- { id: 2, class: gprb }
- { id: 3, class: gprb }
- { id: 4, class: gprb }
# CHECK-DAG: id: 0, class: gpr
# CHECK-DAG: id: 1, class: gpr
# CHECK-DAG: id: 2, class: gpr
# CHECK-DAG: id: 3, class: gpr
# CHECK-DAG: id: 4, class: gpr
fixedStack:
- { id: 0, offset: 0, size: 1, alignment: 4, isImmutable: true, isAliased: false }
- { id: 1, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
@ -740,8 +735,11 @@ body: |
%3(s1) = G_LOAD %2(p0) :: (load 1)
; CHECK: [[LD1VREG:%[0-9]+]] = LDRBi12 [[FI1VREG]], 0, 14, _
%r0 = COPY %3
; CHECK: %r0 = COPY [[LD1VREG]]
%4(s32) = G_ANYEXT %3(s1)
; CHECK: [[RES:%[0-9]+]] = COPY [[LD1VREG]]
%r0 = COPY %4
; CHECK: %r0 = COPY [[RES]]
BX_RET 14, _
; CHECK: BX_RET 14, _
@ -822,14 +820,14 @@ registers:
# CHECK: id: [[F64:[0-9]+]], class: dpr
body: |
bb.0:
liveins: %r0, %r1, %r2, %r3
liveins: %r0, %r1, %s0, %d0
%0(p0) = COPY %r0
%1(s8) = COPY %r3
%2(s16) = COPY %r2
%3(s32) = COPY %r1
%4(s32) = COPY %s0
%5(s64) = COPY %d2
%1(s8) = G_TRUNC %3(s32)
%2(s16) = G_TRUNC %3(s32)
G_STORE %1(s8), %0(p0) :: (store 1)
; CHECK: STRBi12 %[[I8]], %[[P]], 0, 14, _
@ -927,7 +925,7 @@ registers:
- { id: 3, class: gprb }
body: |
bb.0:
liveins: %r0, %r1, %r2
liveins: %r0, %r1
%0(s32) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
@ -935,8 +933,8 @@ body: |
%1(s32) = COPY %r1
; CHECK: [[VREGY:%[0-9]+]] = COPY %r1
%2(s1) = COPY %r2
; CHECK: [[VREGC:%[0-9]+]] = COPY %r2
%2(s1) = G_TRUNC %1(s32)
; CHECK: [[VREGC:%[0-9]+]] = COPY [[VREGY]]
%3(s32) = G_SELECT %2(s1), %0, %1
; CHECK: CMPri [[VREGC]], 0, 14, _, implicit-def %cpsr
@ -962,7 +960,7 @@ registers:
- { id: 3, class: gprb }
body: |
bb.0:
liveins: %r0, %r1, %r2
liveins: %r0, %r1
%0(p0) = COPY %r0
; CHECK: [[VREGX:%[0-9]+]] = COPY %r0
@ -970,8 +968,8 @@ body: |
%1(p0) = COPY %r1
; CHECK: [[VREGY:%[0-9]+]] = COPY %r1
%2(s1) = COPY %r2
; CHECK: [[VREGC:%[0-9]+]] = COPY %r2
%2(s1) = G_TRUNC %1(p0)
; CHECK: [[VREGC:%[0-9]+]] = COPY [[VREGY]]
%3(p0) = G_SELECT %2(s1), %0, %1
; CHECK: CMPri [[VREGC]], 0, 14, _, implicit-def %cpsr
@ -992,16 +990,19 @@ selected: false
# CHECK: selected: true
registers:
- { id: 0, class: gprb }
- { id: 1, class: gprb }
body: |
bb.0:
; CHECK: bb.0
successors: %bb.1(0x40000000), %bb.2(0x40000000)
liveins: %r0
%0(s1) = COPY %r0
; CHECK: [[COND:%[0-9]+]] = COPY %r0
%0(s32) = COPY %r0
; CHECK: [[COND32:%[0-9]+]] = COPY %r0
%1(s1) = G_TRUNC %0(s32)
; CHECK: [[COND:%[0-9]+]] = COPY [[COND32]]
G_BRCOND %0(s1), %bb.1
G_BRCOND %1(s1), %bb.1
; CHECK: TSTri [[COND]], 1, 14, _, implicit-def %cpsr
; CHECK: Bcc %bb.1, 0, %cpsr
G_BR %bb.2

View File

@ -105,16 +105,29 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s16) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s16) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_SEXT [[X]](s16)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_SEXT [[Y]](s16)
%0(s16) = COPY %r0
%1(s16) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 16
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[SHIFTEDX:%[0-9]+]](s32) = G_SHL [[X]], [[BITS]]
; CHECK: [[X32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 16
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[SHIFTEDY:%[0-9]+]](s32) = G_SHL [[Y]], [[BITS]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
%0(s32) = COPY %r0
%1(s16) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s16) = G_TRUNC %2(s32)
; HWDIV: [[R32:%[0-9]+]](s32) = G_SDIV [[X32]], [[Y32]]
; SOFT-NOT: G_SDIV
; SOFT: ADJCALLSTACKDOWN
@ -126,11 +139,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_SDIV
; CHECK: [[R:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R16:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_SEXT [[R16]]
; SOFT-NOT: G_SDIV
%2(s16) = G_SDIV %0, %1
%4(s16) = G_SDIV %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s16)
%5(s32) = G_SEXT %4(s16)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -145,16 +160,27 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s16) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s16) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_ZEXT [[X]](s16)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_ZEXT [[Y]](s16)
%0(s16) = COPY %r0
%1(s16) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 65535
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[X32:%[0-9]+]](s32) = G_AND [[X]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 65535
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_AND [[Y]], [[BITS]]
%0(s32) = COPY %r0
%1(s16) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s16) = G_TRUNC %2(s32)
; HWDIV: [[R32:%[0-9]+]](s32) = G_UDIV [[X32]], [[Y32]]
; SOFT-NOT: G_UDIV
; SOFT: ADJCALLSTACKDOWN
@ -166,11 +192,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_UDIV
; CHECK: [[R:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R16:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_ZEXT [[R16]]
; SOFT-NOT: G_UDIV
%2(s16) = G_UDIV %0, %1
%4(s16) = G_UDIV %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s16)
%5(s32) = G_ZEXT %4(s16)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -185,16 +213,29 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s8) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s8) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_SEXT [[X]](s8)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_SEXT [[Y]](s8)
%0(s8) = COPY %r0
%1(s8) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 24
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[SHIFTEDX:%[0-9]+]](s32) = G_SHL [[X]], [[BITS]]
; CHECK: [[X32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 24
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[SHIFTEDY:%[0-9]+]](s32) = G_SHL [[Y]], [[BITS]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
%0(s32) = COPY %r0
%1(s8) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s8) = G_TRUNC %2(s32)
; HWDIV: [[R32:%[0-9]+]](s32) = G_SDIV [[X32]], [[Y32]]
; SOFT-NOT: G_SDIV
; SOFT: ADJCALLSTACKDOWN
@ -206,11 +247,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_SDIV
; CHECK: [[R:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R8:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_SEXT [[R8]]
; SOFT-NOT: G_SDIV
%2(s8) = G_SDIV %0, %1
%4(s8) = G_SDIV %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s8)
%5(s32) = G_SEXT %4(s8)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -225,16 +268,27 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s8) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s8) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_ZEXT [[X]](s8)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_ZEXT [[Y]](s8)
%0(s8) = COPY %r0
%1(s8) = COPY %r1
; CHECK-DAG: [[X:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 255
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[X32:%[0-9]+]](s32) = G_AND [[X]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 255
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_AND [[Y]], [[BITS]]
%0(s32) = COPY %r0
%1(s8) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s8) = G_TRUNC %2(s32)
; HWDIV: [[R32:%[0-9]+]](s32) = G_UDIV [[X32]], [[Y32]]
; SOFT-NOT: G_UDIV
; SOFT: ADJCALLSTACKDOWN
@ -246,11 +300,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_UDIV
; CHECK: [[R:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R8:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_ZEXT [[R8]]
; SOFT-NOT: G_UDIV
%2(s8) = G_UDIV %0, %1
%4(s8) = G_UDIV %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s8)
%5(s32) = G_ZEXT %4(s8)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -341,16 +397,29 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s16) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s16) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_SEXT [[X]](s16)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_SEXT [[Y]](s16)
%0(s16) = COPY %r0
%1(s16) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 16
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[SHIFTEDX:%[0-9]+]](s32) = G_SHL [[X]], [[BITS]]
; CHECK: [[X32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 16
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[SHIFTEDY:%[0-9]+]](s32) = G_SHL [[Y]], [[BITS]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
%0(s32) = COPY %r0
%1(s16) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s16) = G_TRUNC %2(s32)
; HWDIV: [[Q32:%[0-9]+]](s32) = G_SDIV [[X32]], [[Y32]]
; HWDIV: [[P32:%[0-9]+]](s32) = G_MUL [[Q32]], [[Y32]]
; HWDIV: [[R32:%[0-9]+]](s32) = G_SUB [[X32]], [[P32]]
@ -364,11 +433,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_SREM
; CHECK: [[R:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R16:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_SEXT [[R16]]
; SOFT-NOT: G_SREM
%2(s16) = G_SREM %0, %1
%4(s16) = G_SREM %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s16)
%5(s32) = G_SEXT %4(s16)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -383,16 +454,27 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s16) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s16) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_ZEXT [[X]](s16)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_ZEXT [[Y]](s16)
%0(s16) = COPY %r0
%1(s16) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 65535
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[X32:%[0-9]+]](s32) = G_AND [[X]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 65535
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_AND [[Y]], [[BITS]]
%0(s32) = COPY %r0
%1(s16) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s16) = G_TRUNC %2(s32)
; HWDIV: [[Q32:%[0-9]+]](s32) = G_UDIV [[X32]], [[Y32]]
; HWDIV: [[P32:%[0-9]+]](s32) = G_MUL [[Q32]], [[Y32]]
; HWDIV: [[R32:%[0-9]+]](s32) = G_SUB [[X32]], [[P32]]
@ -406,11 +488,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_UREM
; CHECK: [[R:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R16:%[0-9]+]](s16) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_ZEXT [[R16]]
; SOFT-NOT: G_UREM
%2(s16) = G_UREM %0, %1
%4(s16) = G_UREM %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s16)
%5(s32) = G_ZEXT %4(s16)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -425,16 +509,29 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s8) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s8) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_SEXT [[X]](s8)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_SEXT [[Y]](s8)
%0(s8) = COPY %r0
%1(s8) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 24
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[SHIFTEDX:%[0-9]+]](s32) = G_SHL [[X]], [[BITS]]
; CHECK: [[X32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDX]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 24
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[SHIFTEDY:%[0-9]+]](s32) = G_SHL [[Y]], [[BITS]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_ASHR [[SHIFTEDY]], [[BITS]]
%0(s32) = COPY %r0
%1(s8) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s8) = G_TRUNC %2(s32)
; HWDIV: [[Q32:%[0-9]+]](s32) = G_SDIV [[X32]], [[Y32]]
; HWDIV: [[P32:%[0-9]+]](s32) = G_MUL [[Q32]], [[Y32]]
; HWDIV: [[R32:%[0-9]+]](s32) = G_SUB [[X32]], [[P32]]
@ -448,11 +545,13 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_SREM
; CHECK: [[R:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R8:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_SEXT [[R8]]
; SOFT-NOT: G_SREM
%2(s8) = G_SREM %0, %1
%4(s8) = G_SREM %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s8)
%5(s32) = G_SEXT %4(s8)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...
---
@ -467,16 +566,27 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
- { id: 5, class: _ }
body: |
bb.0:
liveins: %r0, %r1
; CHECK-DAG: [[X:%[0-9]+]](s8) = COPY %r0
; CHECK-DAG: [[Y:%[0-9]+]](s8) = COPY %r1
; CHECK-DAG: [[X32:%[0-9]+]](s32) = G_ZEXT [[X]](s8)
; CHECK-DAG: [[Y32:%[0-9]+]](s32) = G_ZEXT [[Y]](s8)
%0(s8) = COPY %r0
%1(s8) = COPY %r1
; CHECK-DAG: [[R0:%[0-9]+]](s32) = COPY %r0
; CHECK-DAG: [[R1:%[0-9]+]](s32) = COPY %r1
; The G_TRUNC will combine with the extensions introduced by the legalizer,
; leading to the following complicated sequences.
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 255
; CHECK: [[X:%[0-9]+]](s32) = COPY [[R0]]
; CHECK: [[X32:%[0-9]+]](s32) = G_AND [[X]], [[BITS]]
; CHECK: [[BITS:%[0-9]+]](s32) = G_CONSTANT i32 255
; CHECK: [[Y:%[0-9]+]](s32) = COPY [[R1]]
; CHECK: [[Y32:%[0-9]+]](s32) = G_AND [[Y]], [[BITS]]
%0(s32) = COPY %r0
%1(s8) = G_TRUNC %0(s32)
%2(s32) = COPY %r1
%3(s8) = G_TRUNC %2(s32)
; HWDIV: [[Q32:%[0-9]+]](s32) = G_UDIV [[X32]], [[Y32]]
; HWDIV: [[P32:%[0-9]+]](s32) = G_MUL [[Q32]], [[Y32]]
; HWDIV: [[R32:%[0-9]+]](s32) = G_SUB [[X32]], [[P32]]
@ -490,10 +600,12 @@ body: |
; SOFT-DEFAULT: [[R32:%[0-9]+]](s32) = COPY %r0
; SOFT: ADJCALLSTACKUP
; SOFT-NOT: G_UREM
; CHECK: [[R:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R8:%[0-9]+]](s8) = G_TRUNC [[R32]]
; CHECK: [[R:%[0-9]+]](s32) = G_ZEXT [[R8]]
; SOFT-NOT: G_UREM
%2(s8) = G_UREM %0, %1
%4(s8) = G_UREM %1, %3
; CHECK: %r0 = COPY [[R]]
%r0 = COPY %2(s8)
%5(s32) = G_ZEXT %4(s8)
%r0 = COPY %5(s32)
BX_RET 14, _, implicit %r0
...

View File

@ -71,7 +71,7 @@ body: |
bb.0:
liveins: %r0
%0(s8) = COPY %r0
%0(s8) = G_CONSTANT i8 42
%1(s32) = G_SEXT %0
; G_SEXT with s8 is legal, so we should find it unchanged in the output
; CHECK: {{%[0-9]+}}(s32) = G_SEXT {{%[0-9]+}}
@ -93,7 +93,7 @@ body: |
bb.0:
liveins: %r0
%0(s16) = COPY %r0
%0(s16) = G_CONSTANT i16 42
%1(s32) = G_ZEXT %0
; G_ZEXT with s16 is legal, so we should find it unchanged in the output
; CHECK: {{%[0-9]+}}(s32) = G_ZEXT {{%[0-9]+}}
@ -112,18 +112,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 12
%1(s8) = G_CONSTANT i8 30
%2(s8) = G_ADD %0, %1
; G_ADD with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_ADD {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_ADD {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_ADD {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -138,18 +140,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 32
%1(s16) = G_CONSTANT i16 10
%2(s16) = G_ADD %0, %1
; G_ADD with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_ADD {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_ADD {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_ADD {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -190,18 +194,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 48
%1(s8) = G_CONSTANT i8 6
%2(s8) = G_SUB %0, %1
; G_SUB with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_SUB {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_SUB {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_SUB {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -216,18 +222,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 58
%1(s16) = G_CONSTANT i16 16
%2(s16) = G_SUB %0, %1
; G_SUB with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_SUB {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_SUB {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_SUB {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -268,18 +276,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 7
%1(s8) = G_CONSTANT i8 6
%2(s8) = G_MUL %0, %1
; G_MUL with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_MUL {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_MUL {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_MUL {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -294,18 +304,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 3
%1(s16) = G_CONSTANT i16 14
%2(s16) = G_MUL %0, %1
; G_MUL with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_MUL {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_MUL {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_MUL {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -346,18 +358,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 46
%1(s8) = G_CONSTANT i8 58
%2(s8) = G_AND %0, %1
; G_AND with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_AND {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_AND {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_AND {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -372,18 +386,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 43
%1(s16) = G_CONSTANT i16 106
%2(s16) = G_AND %0, %1
; G_AND with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_AND {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_AND {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_AND {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -424,18 +440,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 32
%1(s8) = G_CONSTANT i8 10
%2(s8) = G_OR %0, %1
; G_OR with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_OR {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_OR {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_OR {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -450,18 +468,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 34
%1(s16) = G_CONSTANT i16 10
%2(s16) = G_OR %0, %1
; G_OR with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_OR {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_OR {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_OR {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -502,18 +522,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 10
%1(s8) = G_CONSTANT i8 32
%2(s8) = G_XOR %0, %1
; G_XOR with s8 should widen
; CHECK-NOT: {{%[0-9]+}}(s8) = G_XOR {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_XOR {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s8) = G_XOR {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s8)
%3(s32) = G_SEXT %2(s8)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
---
@ -528,18 +550,20 @@ registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 40
%1(s16) = G_CONSTANT i16 2
%2(s16) = G_XOR %0, %1
; G_XOR with s16 should widen
; CHECK-NOT: {{%[0-9]+}}(s16) = G_XOR {{%[0-9]+, %[0-9]+}}
; CHECK: {{%[0-9]+}}(s32) = G_XOR {{%[0-9]+, %[0-9]+}}
; CHECK-NOT: {{%[0-9]+}}(s16) = G_XOR {{%[0-9]+, %[0-9]+}}
%r0 = COPY %2(s16)
%3(s32) = G_SEXT %2(s16)
%r0 = COPY %3(s32)
BX_RET 14, _, implicit %r0
...
@ -740,11 +764,11 @@ body: |
G_STORE %1(s64), %0(p0) :: (store 8)
%2(s32) = COPY %r2
G_STORE %2(s32), %0(p0) :: (store 4)
%3(s16) = COPY %r3
%3(s16) = G_CONSTANT i16 42
G_STORE %3(s16), %0(p0) :: (store 2)
%4(s8) = COPY %r4
%4(s8) = G_CONSTANT i8 21
G_STORE %4(s8), %0(p0) :: (store 1)
%5(s1) = COPY %r5
%5(s1) = G_CONSTANT i1 1
G_STORE %5(s1), %0(p0) :: (store 1)
%6(p0) = COPY %r6
G_STORE %6(p0), %0(p0) :: (store 4)
@ -831,8 +855,8 @@ body: |
bb.0:
liveins: %r0, %r1
%0(s8) = COPY %r0
%1(s8) = COPY %r1
%0(s8) = G_CONSTANT i8 42
%1(s8) = G_CONSTANT i8 43
%2(s1) = G_ICMP intpred(ne), %0(s8), %1
; G_ICMP with s8 should widen
; CHECK: {{%[0-9]+}}(s1) = G_ICMP intpred(ne), {{%[0-9]+}}(s32), {{%[0-9]+}}
@ -858,8 +882,8 @@ body: |
bb.0:
liveins: %r0, %r1
%0(s16) = COPY %r0
%1(s16) = COPY %r1
%0(s16) = G_CONSTANT i16 42
%1(s16) = G_CONSTANT i16 46
%2(s1) = G_ICMP intpred(slt), %0(s16), %1
; G_ICMP with s16 should widen
; CHECK: {{%[0-9]+}}(s1) = G_ICMP intpred(slt), {{%[0-9]+}}(s32), {{%[0-9]+}}
@ -913,7 +937,7 @@ body: |
%0(s32) = COPY %r0
%1(s32) = COPY %r1
%2(s1) = COPY %r2
%2(s1) = G_CONSTANT i1 1
%3(s32) = G_SELECT %2(s1), %0, %1
; G_SELECT with s32 is legal, so we should find it unchanged in the output
; CHECK: {{%[0-9]+}}(s32) = G_SELECT {{%[0-9]+}}(s1), {{%[0-9]+}}, {{%[0-9]+}}
@ -939,7 +963,7 @@ body: |
%0(p0) = COPY %r0
%1(p0) = COPY %r1
%2(s1) = COPY %r2
%2(s1) = G_CONSTANT i1 0
%3(p0) = G_SELECT %2(s1), %0, %1
; G_SELECT with p0 is legal, so we should find it unchanged in the output
; CHECK: {{%[0-9]+}}(p0) = G_SELECT {{%[0-9]+}}(s1), {{%[0-9]+}}, {{%[0-9]+}}

View File

@ -395,15 +395,15 @@ registers:
- { id: 6, class: _ }
body: |
bb.0:
liveins: %r0, %r1, %r2, %r3, %r4, %r5, %d6
liveins: %r0, %r1, %r5, %d6
%0(p0) = COPY %r0
%1(s32) = COPY %r1
G_STORE %1(s32), %0 :: (store 4)
%2(s16) = COPY %r2
%2(s16) = G_TRUNC %1(s32)
G_STORE %2(s16), %0 :: (store 2)
%3(s8) = COPY %r3
%3(s8) = G_TRUNC %1(s32)
G_STORE %3(s8), %0 :: (store 1)
%4(s1) = COPY %r4
%4(s1) = G_TRUNC %1(s32)
G_STORE %4(s1), %0 :: (store 1)
%5(p0) = COPY %r5
G_STORE %5(p0), %0 :: (store 4)
@ -511,16 +511,19 @@ selected: false
# CHECK: registers:
# CHECK: - { id: 0, class: gprb, preferred-register: '' }
# CHECK: - { id: 1, class: gprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
body: |
bb.0:
liveins: %r0
%0(s8) = COPY %r0
%1(s32) = G_ANYEXT %0(s8)
%r0 = COPY %1(s32)
%0(s32) = COPY %r0
%1(s8) = G_TRUNC %0(s32)
%2(s32) = G_ANYEXT %1(s8)
%r0 = COPY %2(s32)
BX_RET 14, _, implicit %r0
...
---
@ -532,16 +535,19 @@ selected: false
# CHECK: registers:
# CHECK: - { id: 0, class: gprb, preferred-register: '' }
# CHECK: - { id: 1, class: gprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
body: |
bb.0:
liveins: %r0
%0(s16) = COPY %r0
%1(s32) = G_ANYEXT %0(s16)
%r0 = COPY %1(s32)
%0(s32) = COPY %r0
%1(s16) = G_TRUNC %0(s32)
%2(s32) = G_ANYEXT %1(s16)
%r0 = COPY %2(s32)
BX_RET 14, _, implicit %r0
...
---
@ -553,17 +559,20 @@ selected: false
# CHECK: registers:
# CHECK: - { id: 0, class: gprb, preferred-register: '' }
# CHECK: - { id: 1, class: gprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
body: |
bb.0:
liveins: %r0
liveins: %r0, %r1
%0(s32) = COPY %r0
%2(p0) = COPY %r1
%1(s16) = G_TRUNC %0(s32)
%r0 = COPY %1(s16)
BX_RET 14, _, implicit %r0
G_STORE %1(s16), %2 :: (store 2)
BX_RET 14, _
...
---
name: test_icmp_eq_s32
@ -575,6 +584,7 @@ selected: false
# CHECK: - { id: 0, class: gprb, preferred-register: '' }
# CHECK: - { id: 1, class: gprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
# CHECK: - { id: 3, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
@ -603,6 +613,7 @@ selected: false
# CHECK: - { id: 0, class: fprb, preferred-register: '' }
# CHECK: - { id: 1, class: fprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
# CHECK: - { id: 3, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
@ -631,6 +642,7 @@ selected: false
# CHECK: - { id: 0, class: fprb, preferred-register: '' }
# CHECK: - { id: 1, class: fprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
# CHECK: - { id: 3, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
@ -660,21 +672,24 @@ selected: false
# CHECK: - { id: 1, class: gprb, preferred-register: '' }
# CHECK: - { id: 2, class: gprb, preferred-register: '' }
# CHECK: - { id: 3, class: gprb, preferred-register: '' }
# CHECK: - { id: 4, class: gprb, preferred-register: '' }
registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
- { id: 2, class: _ }
- { id: 3, class: _ }
- { id: 4, class: _ }
body: |
bb.0:
liveins: %r0, %r1, %r2
%0(s32) = COPY %r0
%1(s32) = COPY %r1
%2(s1) = COPY %r2
%3(s32) = G_SELECT %2(s1), %0, %1
%r0 = COPY %3(s32)
%2(s32) = COPY %r2
%3(s1) = G_TRUNC %2(s32)
%4(s32) = G_SELECT %3(s1), %0, %1
%r0 = COPY %4(s32)
BX_RET 14, _, implicit %r0
...
@ -687,7 +702,9 @@ regBankSelected: false
selected: false
registers:
- { id: 0, class: _ }
- { id: 1, class: _ }
# CHECK: { id: 0, class: gprb, preferred-register: '' }
# CHECK: { id: 1, class: gprb, preferred-register: '' }
# Check that we map the condition of the G_BRCOND into the GPR.
# For the G_BR, there are no registers to map, but make sure we don't crash.
body: |
@ -695,8 +712,9 @@ body: |
successors: %bb.1(0x40000000), %bb.2(0x40000000)
liveins: %r0
%0(s1) = COPY %r0
G_BRCOND %0(s1), %bb.1
%0(s32) = COPY %r0
%1(s1) = G_TRUNC %0(s32)
G_BRCOND %1(s1), %bb.1
G_BR %bb.2
bb.1: