-
Notifications
You must be signed in to change notification settings - Fork 11.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RegisterCoalescer] Fix SUBREG_TO_REG handling in the RegisterCoalescer. #96839
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 | ||
# RUN: llc -mtriple powerpc64le-unknown-linux-gnu -mcpu=pwr8 %s \ | ||
# RUN: -verify-coalescing --run-pass=register-coalescer -o - | FileCheck %s | ||
|
||
# Check that the register coalescer correctly handles merging live ranges over | ||
# SUBREG_TO_REG on PowerPC. The -verify-coalescing option will give an error if | ||
# this is incorrect. | ||
|
||
--- | ||
name: check_subregs | ||
alignment: 16 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $x3 | ||
; CHECK-LABEL: name: check_subregs | ||
; CHECK: liveins: $x3 | ||
; CHECK-NEXT: {{ $}} | ||
; CHECK-NEXT: [[COPY:%[0-9]+]]:g8rc_and_g8rc_nox0 = COPY $x3 | ||
; CHECK-NEXT: [[LFSUX:%[0-9]+]]:f8rc, dead [[LFSUX1:%[0-9]+]]:g8rc_and_g8rc_nox0 = LFSUX [[COPY]], [[COPY]] | ||
; CHECK-NEXT: undef [[FRSP:%[0-9]+]].sub_64:vslrc = FRSP [[LFSUX]], implicit $rm | ||
; CHECK-NEXT: [[XVCVDPSP:%[0-9]+]]:vrrc = XVCVDPSP [[FRSP]], implicit $rm | ||
; CHECK-NEXT: $v2 = COPY [[XVCVDPSP]] | ||
; CHECK-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $v2 | ||
%0:g8rc_and_g8rc_nox0 = COPY $x3 | ||
%1:f8rc, %2:g8rc_and_g8rc_nox0 = LFSUX %0, %0 | ||
%3:f4rc = FRSP killed %1, implicit $rm | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Compact the register numbers, can do this with -run-pass=none There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did do this but the numbers didn't change. I think it is because both |
||
%4:vslrc = SUBREG_TO_REG 1, %3, %subreg.sub_64 | ||
%5:vrrc = XVCVDPSP killed %4, implicit $rm | ||
$v2 = COPY %5 | ||
BLR8 implicit $lr8, implicit $rm, implicit $v2 | ||
... | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Pre-commit this case to show where |
||
# RUN: llc -mtriple x86_64-unknown-unknown %s \ | ||
# RUN: -verify-coalescing -enable-subreg-liveness \ | ||
# RUN: --run-pass=register-coalescer -o - | FileCheck %s | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you add a comment explaining the test? |
||
# Check that the register coalescer correctly handles merging live ranges over | ||
# SUBREG_TO_REG on X86. The -verify-coalescing option will give an error if | ||
# this is incorrect. | ||
|
||
--- | ||
arsenm marked this conversation as resolved.
Show resolved
Hide resolved
|
||
name: test1 | ||
alignment: 16 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
; CHECK-LABEL: name: test1 | ||
; CHECK: undef [[MOV32rm:%[0-9]+]].sub_32bit:gr64_nosp = MOV32rm undef %1:gr64, 1, $noreg, 0, $noreg :: (volatile load (s32) from `ptr undef`) | ||
; CHECK-NEXT: undef [[MOV32rm1:%[0-9]+]].sub_32bit:gr64_with_sub_8bit = MOV32rm undef %4:gr64, 1, $noreg, 0, $noreg :: (volatile load (s32) from `ptr undef`) | ||
; CHECK-NEXT: [[MOV32rm1:%[0-9]+]]:gr64_with_sub_8bit = SHL64ri [[MOV32rm1]], 32, implicit-def dead $eflags | ||
; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64_with_sub_8bit = LEA64r [[MOV32rm1]], 1, [[MOV32rm]], 256, $noreg | ||
; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64_with_sub_8bit = SHR64ri [[LEA64r]], 8, implicit-def dead $eflags | ||
; CHECK-NEXT: MOV32mr undef %10:gr64, 1, $noreg, 0, $noreg, [[LEA64r]].sub_32bit :: (volatile store (s32) into `ptr undef`) | ||
; CHECK-NEXT: RET 0, undef $eax | ||
%0:gr32 = MOV32rm undef %1:gr64, 1, $noreg, 0, $noreg :: (volatile load (s32) from `ptr undef`) | ||
%2:gr64_nosp = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit | ||
%3:gr32 = MOV32rm undef %4:gr64, 1, $noreg, 0, $noreg :: (volatile load (s32) from `ptr undef`) | ||
%5:gr64 = SUBREG_TO_REG 0, killed %3, %subreg.sub_32bit | ||
%6:gr64 = COPY killed %5 | ||
%6:gr64 = SHL64ri %6, 32, implicit-def dead $eflags | ||
%7:gr64 = LEA64r killed %6, 1, killed %2, 256, $noreg | ||
%8:gr64 = COPY killed %7 | ||
%8:gr64 = SHR64ri %8, 8, implicit-def dead $eflags | ||
%9:gr32 = COPY killed %8.sub_32bit | ||
MOV32mr undef %10:gr64, 1, $noreg, 0, $noreg, killed %9 :: (volatile store (s32) into `ptr undef`) | ||
RET 0, undef $eax | ||
... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add a comment explaining the test?