95 lines
4 KiB
YAML
95 lines
4 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass=register-coalescer -o - %s | FileCheck %s
|
|
|
|
# Test used to crash with message:
|
|
# JoinVals::computeAssignment(unsigned int, (anonymous namespace)::JoinVals &): Assertion `Assignments[ValNo] != -1 && "Bad recursion?"' failed.
|
|
|
|
# The issue was with processing two operands are parts of the same reg and are
|
|
# used in the same instruction (e.g. inline asm): first is "def early-clobber",
|
|
# while the other is just "def".
|
|
# Register coalescer ran in bad recursion if the early clobbered subreg is
|
|
# second in the following sequence of COPYs.
|
|
|
|
---
|
|
name: foo1
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0_vgpr1
|
|
|
|
; CHECK-LABEL: name: foo1
|
|
; CHECK: liveins: $vgpr0_vgpr1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VS_32 */, def undef %2.sub0, 1835019 /* regdef-ec:VS_32 */, def undef early-clobber %2.sub1
|
|
; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
; CHECK-NEXT: S_ENDPGM 0
|
|
INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VGPR_32 */, def %0:vgpr_32, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %1:vgpr_32
|
|
undef %2.sub0:vreg_64 = COPY killed %0
|
|
%2.sub1:vreg_64 = COPY killed %1
|
|
FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
name: foo2
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0_vgpr1
|
|
|
|
; CHECK-LABEL: name: foo2
|
|
; CHECK: liveins: $vgpr0_vgpr1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VS_32 */, def undef early-clobber %2.sub1, 1835018 /* regdef:VS_32 */, def undef %2.sub0
|
|
; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
; CHECK-NEXT: S_ENDPGM 0
|
|
INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %1:vgpr_32, 1835018 /* regdef:VGPR_32 */, def %0:vgpr_32
|
|
undef %2.sub0:vreg_64 = COPY killed %0
|
|
%2.sub1:vreg_64 = COPY killed %1
|
|
FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
name: foo3
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0_vgpr1
|
|
|
|
; CHECK-LABEL: name: foo3
|
|
; CHECK: liveins: $vgpr0_vgpr1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VS_32 */, def undef %2.sub0, 1835019 /* regdef-ec:VS_32 */, def undef early-clobber %2.sub1
|
|
; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
; CHECK-NEXT: S_ENDPGM 0
|
|
INLINEASM &"", 0 /* attdialect */, 1835018 /* regdef:VGPR_32 */, def %1:vgpr_32, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %0:vgpr_32
|
|
undef %2.sub0:vreg_64 = COPY killed %1
|
|
%2.sub1:vreg_64 = COPY killed %0
|
|
FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
name: foo4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0_vgpr1
|
|
|
|
; CHECK-LABEL: name: foo4
|
|
; CHECK: liveins: $vgpr0_vgpr1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VS_32 */, def undef early-clobber %2.sub1, 1835018 /* regdef:VS_32 */, def undef %2.sub0
|
|
; CHECK-NEXT: FLAT_STORE_DWORDX2 $vgpr0_vgpr1, %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
; CHECK-NEXT: S_ENDPGM 0
|
|
INLINEASM &"", 0 /* attdialect */, 1835019 /* regdef-ec:VGPR_32 */, def early-clobber %0:vgpr_32, 1835018 /* regdef:VGPR_32 */, def %1:vgpr_32
|
|
undef %2.sub0:vreg_64 = COPY killed %1
|
|
%2.sub1:vreg_64 = COPY killed %0
|
|
FLAT_STORE_DWORDX2 killed $vgpr0_vgpr1, killed %2, 0, 0, implicit $exec, implicit $flat_scr :: (store (s64))
|
|
S_ENDPGM 0
|
|
|
|
...
|