x64: clean up regalloc-related semantics on several instructions. (#4811)

* x64: clean up regalloc-related semantics on several instructions.

This PR removes all uses of "modify" operands on instructions in the x64
backend, and also removes all uses of "pinned vregs", or vregs that are
explicitly tied to particular physical registers. In place of both of
these mechanisms, which are legacies of the old regalloc design and
supported via compatibility code, the backend now uses operand
constraints. This is more flexible as it allows the regalloc to see the
liveranges and constraints without "reverse-engineering" move instructions.

Eventually, after removing all such uses (including in other backends
and by the ABI code), we can remove the compatibility code in regalloc2,
significantly simplifying its liverange-construction frontend and
thus allowing for higher confidence in correctness as well as possibly a
bit more compilation speed.

Curiously, there are a few extra move instructions now; they are likely
poor splitting decisions and I can try to chase these down later.

* Fix cranelift-codegen tests.

* Review feedback.
This commit is contained in:
Chris Fallin
2022-08-30 17:21:14 -07:00
committed by GitHub
parent 3ce3eeb668
commit 186c7c3b89
14 changed files with 543 additions and 284 deletions

View File

@@ -205,9 +205,8 @@ block2:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r8d
; cmpl $2, %edi
; br_table %rdi
; br_table %rdi, %r9, %r10
; block1:
; jmp label3
; block2:

View File

@@ -10,8 +10,9 @@ target x86_64
function %i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = srem.i8 v0, v1
; check: movq %rdi, %rax
; nextln: movl $$0, %edx
; check: xorl %r11d, %r11d, %r11d
; nextln: movq %rdi, %rax
; nextln: movq %r11, %rdx
; nextln: srem_seq %al, %dl, %sil, %al, %dl, tmp=(none)
; nextln: shrq $$8, %rax, %rax
@@ -21,8 +22,9 @@ block0(v0: i8, v1: i8):
function %i16(i16, i16) -> i16 {
block0(v0: i16, v1: i16):
v2 = srem.i16 v0, v1
; check: movq %rdi, %rax
; nextln: movl $$0, %edx
; check: xorl %r11d, %r11d, %r11d
; nextln: movq %rdi, %rax
; nextln: movq %r11, %rdx
; nextln: srem_seq %ax, %dx, %si, %ax, %dx, tmp=(none)
; nextln: movq %rdx, %rax
@@ -32,8 +34,9 @@ block0(v0: i16, v1: i16):
function %i32(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = srem.i32 v0, v1
; check: movq %rdi, %rax
; nextln: movl $$0, %edx
; check: xorl %r11d, %r11d, %r11d
; nextln: movq %rdi, %rax
; nextln: movq %r11, %rdx
; nextln: srem_seq %eax, %edx, %esi, %eax, %edx, tmp=(none)
; nextln: movq %rdx, %rax
@@ -43,8 +46,9 @@ block0(v0: i32, v1: i32):
function %i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = srem.i64 v0, v1
; check: movq %rdi, %rax
; nextln: movl $$0, %edx
; check: xorl %r11d, %r11d, %r11d
; nextln: movq %rdi, %rax
; nextln: movq %r11, %rdx
; nextln: srem_seq %rax, %rdx, %rsi, %rax, %rdx, tmp=(none)
; nextln: movq %rdx, %rax

View File

@@ -146,16 +146,16 @@ block0(v0: i8, v1: i16, v2: i32, v3: i64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movzbq %dil, %rax
; cvtsi2ss %rax, %xmm0
; movzwq %si, %rax
; cvtsi2ss %rax, %xmm6
; movl %edx, %eax
; cvtsi2ss %rax, %xmm7
; u64_to_f32_seq %rcx, %xmm4, %r8, %rdx
; movzbq %dil, %rdi
; cvtsi2ss %rdi, %xmm0
; movzwq %si, %rdi
; cvtsi2ss %rdi, %xmm5
; movl %edx, %edi
; cvtsi2ss %rdi, %xmm6
; u64_to_f32_seq %rcx, %xmm2, %rdi, %rax
; addss %xmm0, %xmm5, %xmm0
; addss %xmm0, %xmm6, %xmm0
; addss %xmm0, %xmm7, %xmm0
; addss %xmm0, %xmm4, %xmm0
; addss %xmm0, %xmm2, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -209,7 +209,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_uint32_seq %xmm0, %eax, %r10, %xmm6
; cvt_float32_to_uint32_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -223,7 +223,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_uint64_seq %xmm0, %rax, %r10, %xmm6
; cvt_float32_to_uint64_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -237,7 +237,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_uint32_seq %xmm0, %eax, %r10, %xmm6
; cvt_float64_to_uint32_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -251,7 +251,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_uint64_seq %xmm0, %rax, %r10, %xmm6
; cvt_float64_to_uint64_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -265,7 +265,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_uint32_sat_seq %xmm0, %eax, %r10, %xmm6
; cvt_float32_to_uint32_sat_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -279,7 +279,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_uint64_sat_seq %xmm0, %rax, %r10, %xmm6
; cvt_float32_to_uint64_sat_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -293,7 +293,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_uint32_sat_seq %xmm0, %eax, %r10, %xmm6
; cvt_float64_to_uint32_sat_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -307,7 +307,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_uint64_sat_seq %xmm0, %rax, %r10, %xmm6
; cvt_float64_to_uint64_sat_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -321,7 +321,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_sint32_seq %xmm0, %eax, %r10, %xmm6
; cvt_float32_to_sint32_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -335,7 +335,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_sint64_seq %xmm0, %rax, %r10, %xmm6
; cvt_float32_to_sint64_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -349,7 +349,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_sint32_seq %xmm0, %eax, %r10, %xmm6
; cvt_float64_to_sint32_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -363,7 +363,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_sint64_seq %xmm0, %rax, %r10, %xmm6
; cvt_float64_to_sint64_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -377,7 +377,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_sint32_sat_seq %xmm0, %eax, %r10, %xmm6
; cvt_float32_to_sint32_sat_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -391,7 +391,7 @@ block0(v0: f32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float32_to_sint64_sat_seq %xmm0, %rax, %r10, %xmm6
; cvt_float32_to_sint64_sat_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -405,7 +405,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_sint32_sat_seq %xmm0, %eax, %r10, %xmm6
; cvt_float64_to_sint32_sat_seq %xmm0, %eax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -419,7 +419,7 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; cvt_float64_to_sint64_sat_seq %xmm0, %rax, %r10, %xmm6
; cvt_float64_to_sint64_sat_seq %xmm0, %rax, %r8, %xmm4
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -11,8 +11,9 @@ block0(v0: i8, v1: i8):
; movq %rsp, %rbp
; block0:
; movq %rdi, %rax
; cbw %al, %dl
; idiv %al, (none), %sil, %al, %dl
; cbw %al, %al
; movq %rax, %rdi
; idiv %al, (none), %sil, %al, (none)
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -28,6 +29,7 @@ block0(v0: i16, v1: i16):
; block0:
; movq %rdi, %rax
; cwd %ax, %dx
; movq %rdx, %r8
; idiv %ax, %dx, %si, %ax, %dx
; movq %rbp, %rsp
; popq %rbp
@@ -44,6 +46,7 @@ block0(v0: i32, v1: i32):
; block0:
; movq %rdi, %rax
; cdq %eax, %edx
; movq %rdx, %r8
; idiv %eax, %edx, %esi, %eax, %edx
; movq %rbp, %rsp
; popq %rbp
@@ -60,6 +63,7 @@ block0(v0: i64, v1: i64):
; block0:
; movq %rdi, %rax
; cqo %rax, %rdx
; movq %rdx, %r8
; idiv %rax, %rdx, %rsi, %rax, %rdx
; movq %rbp, %rsp
; popq %rbp

View File

@@ -12,9 +12,10 @@ block0(v0: i8x16, v1: i8x16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movdqa %xmm0, %xmm9
; movdqa %xmm0, %xmm6
; load_const VCodeConstant(0), %xmm0
; vpermi2b %xmm1, %xmm0, %xmm9
; movdqa %xmm6, %xmm8
; vpermi2b %xmm1, %xmm8, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -31,11 +32,12 @@ block0(v0: i8x16, v1: i8x16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movdqa %xmm0, %xmm12
; movdqa %xmm0, %xmm9
; load_const VCodeConstant(1), %xmm0
; load_const VCodeConstant(0), %xmm7
; vpermi2b %xmm1, %xmm7, %xmm12
; andps %xmm0, %xmm7, %xmm0
; load_const VCodeConstant(0), %xmm8
; movdqa %xmm9, %xmm11
; vpermi2b %xmm1, %xmm11, %xmm8, %xmm8
; andps %xmm0, %xmm8, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -49,9 +51,10 @@ block0(v0: i8x16, v1: i8x16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movdqa %xmm0, %xmm9
; movdqa %xmm0, %xmm6
; load_const VCodeConstant(0), %xmm0
; vpermi2b %xmm1, %xmm0, %xmm9
; movdqa %xmm6, %xmm8
; vpermi2b %xmm1, %xmm8, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -10,8 +10,9 @@ block0(v0: i8, v1: i8):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; xorl %r11d, %r11d, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; srem_seq %al, %dl, %sil, %al, %dl, tmp=(none)
; shrq $8, %rax, %rax
; movq %rbp, %rsp
@@ -27,8 +28,9 @@ block0(v0: i16, v1: i16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; xorl %r11d, %r11d, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; srem_seq %ax, %dx, %si, %ax, %dx, tmp=(none)
; movq %rdx, %rax
; movq %rbp, %rsp
@@ -44,8 +46,9 @@ block0(v0: i32, v1: i32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; xorl %r11d, %r11d, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; srem_seq %eax, %edx, %esi, %eax, %edx, tmp=(none)
; movq %rdx, %rax
; movq %rbp, %rsp
@@ -61,8 +64,9 @@ block0(v0: i64, v1: i64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; xorl %r11d, %r11d, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; srem_seq %rax, %rdx, %rsi, %rax, %rdx, tmp=(none)
; movq %rdx, %rax
; movq %rbp, %rsp

View File

@@ -10,9 +10,9 @@ block0(v0: i8, v1: i8):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %rdi, %rax
; movzbl %al, %eax
; div %al, (none), %sil, %al, %dl
; movzbl %dil, %r10d
; movq %r10, %rax
; div %al, (none), %sil, %al, (none)
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -26,8 +26,9 @@ block0(v0: i16, v1: i16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %ax, %dx, %si, %ax, %dx
; movq %rbp, %rsp
; popq %rbp
@@ -42,8 +43,9 @@ block0(v0: i32, v1: i32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %eax, %edx, %esi, %eax, %edx
; movq %rbp, %rsp
; popq %rbp
@@ -58,8 +60,9 @@ block0(v0: i64, v1: i64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %rax, %rdx, %rsi, %rax, %rdx
; movq %rbp, %rsp
; popq %rbp

View File

@@ -10,9 +10,9 @@ block0(v0: i8, v1: i8):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %rdi, %rax
; movzbl %al, %eax
; div %al, (none), %sil, %al, %dl
; movzbl %dil, %r10d
; movq %r10, %rax
; div %al, (none), %sil, %al, (none)
; shrq $8, %rax, %rax
; movq %rbp, %rsp
; popq %rbp
@@ -27,8 +27,9 @@ block0(v0: i16, v1: i16):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %ax, %dx, %si, %ax, %dx
; movq %rdx, %rax
; movq %rbp, %rsp
@@ -44,8 +45,9 @@ block0(v0: i32, v1: i32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %eax, %edx, %esi, %eax, %edx
; movq %rdx, %rax
; movq %rbp, %rsp
@@ -61,8 +63,9 @@ block0(v0: i64, v1: i64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $0, %r11d
; movq %rdi, %rax
; movl $0, %edx
; movq %r11, %rdx
; div %rax, %rdx, %rsi, %rax, %rdx
; movq %rdx, %rax
; movq %rbp, %rsp