mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
5742e35593
We have loads preserving low and high 16 bits of their destinations. However, we always use a whole 32 bit register for these. The same happens with 16 bit stores, we have to use full 32 bit register so if high bits are clobbered the register needs to be copied. One example of such code is added to the load-hi16.ll. The proper solution to the problem is to define 16 bit subregs and use them in the operations which do not read another half of a VGPR or preserve it if the VGPR is written. This patch simply defines subregisters and register classes. At the moment there should be no difference in code generation. A lot more work is needed to actually use these new register classes. Therefore, there are no new tests at this time. Register weight calculation has changed with new subregs so appropriate changes were made to keep all calculations just as they are now, especially calculations of register pressure. Differential Revision: https://reviews.llvm.org/D74873
29 lines
1.2 KiB
YAML
29 lines
1.2 KiB
YAML
# RUN: not --crash llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -verify-machineinstrs -run-pass=machine-scheduler -verify-misched -o /dev/null %s 2>&1 | FileCheck %s
|
|
|
|
# CHECK: *** Bad machine code: No live subrange at use ***
|
|
# CHECK-NEXT: - function: at_least_one_value_should_be_defined_by_this_mask
|
|
# CHECK-NEXT: - basic block: %bb.0
|
|
# CHECK-NEXT: - instruction: 48B dead undef %2.sub0:vreg_128 = COPY %0.sub0:vreg_128
|
|
# CHECK-NEXT: - operand 1: %0.sub0:vreg_128
|
|
# CHECK-NEXT: - interval: %0 [16r,48r:0) 0@16r L000000000000000C [16r,32r:0) 0@16r weight:0.000000e+00
|
|
|
|
# This used to assert with: !SR.empty() && "At least one value should be defined by this mask"
|
|
|
|
# This MIR is invalid and should be caught by the verifier. %0.sub0 is
|
|
# used, but not defined. There are also lanes in %0 that are not used
|
|
# or defined anywhere. Previously there was an assertion in the
|
|
# LiveInterval computation, which was more confusing. The invalid
|
|
# LiveRange should be produced and the verifier will catch it.
|
|
|
|
---
|
|
name: at_least_one_value_should_be_defined_by_this_mask
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
|
|
undef %0.sub1:vreg_128 = V_MOV_B32_e32 0, implicit $exec
|
|
%1:vreg_128 = COPY %0
|
|
undef %2.sub0:vreg_128 = COPY %0.sub0
|
|
|
|
...
|