contractCrossBankCopyIntoStore() finds the instruction defines the source register and uses its output to replace the register. There are, however, instructions that have multiple outputs, e.g. G_UNMERGE_VALUES. Current implementation hardcodes to operand 0 and has no way of knowing which output should be used. This change adds another function to directly return the register that is the source of the register and use that for folding. This fixes https://bugs.llvm.org/show_bug.cgi?id=44783 Differential Revision: https://reviews.llvm.org/D74005
130 lines
4.4 KiB
YAML
130 lines
4.4 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
|
|
|
|
--- |
|
|
define void @contract_s64_gpr(i64* %addr) { ret void }
|
|
define void @contract_s32_gpr(i32* %addr) { ret void }
|
|
define void @contract_s64_fpr(i64* %addr) { ret void }
|
|
define void @contract_s32_fpr(i32* %addr) { ret void }
|
|
define void @contract_s16_fpr(i16* %addr) { ret void }
|
|
define void @contract_g_unmerge_values_first(i128* %addr) { ret void }
|
|
define void @contract_g_unmerge_values_second(i128* %addr) { ret void }
|
|
...
|
|
---
|
|
name: contract_s64_gpr
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: contract_s64_gpr
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
|
|
; CHECK: STRXui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:gpr(s64) = COPY $x1
|
|
%2:fpr(s64) = COPY %1
|
|
G_STORE %2:fpr(s64), %0 :: (store 8 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_s32_gpr
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $w1
|
|
; CHECK-LABEL: name: contract_s32_gpr
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
|
|
; CHECK: STRWui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:gpr(s32) = COPY $w1
|
|
%2:fpr(s32) = COPY %1
|
|
G_STORE %2:fpr(s32), %0 :: (store 4 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_s64_fpr
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $d1
|
|
; CHECK-LABEL: name: contract_s64_fpr
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
|
|
; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:fpr(s64) = COPY $d1
|
|
%2:gpr(s64) = COPY %1
|
|
G_STORE %2:gpr(s64), %0 :: (store 8 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_s32_fpr
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $s1
|
|
; CHECK-LABEL: name: contract_s32_fpr
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
|
|
; CHECK: STRSui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:fpr(s32) = COPY $s1
|
|
%2:gpr(s32) = COPY %1
|
|
G_STORE %2:gpr(s32), %0 :: (store 4 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_s16_fpr
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $h1
|
|
; CHECK-LABEL: name: contract_s16_fpr
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr16 = COPY $h1
|
|
; CHECK: STRHui [[COPY1]], [[COPY]], 0 :: (store 2 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:fpr(s16) = COPY $h1
|
|
%2:gpr(s16) = COPY %1
|
|
G_STORE %2:gpr(s16), %0 :: (store 2 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_g_unmerge_values_first
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: contract_g_unmerge_values_first
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[LOAD:%[0-9]+]]:fpr128 = LDRQui [[COPY]], 0
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[LOAD]].dsub
|
|
; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:fpr(<2 x s64>) = G_LOAD %0:gpr(p0) :: (dereferenceable load 16 from %ir.addr)
|
|
%2:fpr(s64), %3:fpr(s64) = G_UNMERGE_VALUES %1:fpr(<2 x s64>)
|
|
%4:gpr(s64) = COPY %2
|
|
%5:gpr(s64) = COPY %3
|
|
G_STORE %4:gpr(s64), %0 :: (store 8 into %ir.addr)
|
|
...
|
|
---
|
|
name: contract_g_unmerge_values_second
|
|
legalized: true
|
|
regBankSelected: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: contract_g_unmerge_values_second
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
|
|
; CHECK: [[LOAD:%[0-9]+]]:fpr128 = LDRQui [[COPY]], 0
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = CPYi64 [[LOAD]], 1
|
|
; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
|
|
%0:gpr(p0) = COPY $x0
|
|
%1:fpr(<2 x s64>) = G_LOAD %0:gpr(p0) :: (dereferenceable load 16 from %ir.addr)
|
|
%2:fpr(s64), %3:fpr(s64) = G_UNMERGE_VALUES %1:fpr(<2 x s64>)
|
|
%4:gpr(s64) = COPY %2
|
|
%5:gpr(s64) = COPY %3
|
|
G_STORE %5:gpr(s64), %0 :: (store 8 into %ir.addr)
|