[llvm] [AMDGPU] Check vector sizes for physical register constraints in inline asm (PR #109955)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 25 04:00:40 PDT 2024
================
@@ -0,0 +1,157 @@
+; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s 2>&1 | FileCheck -check-prefix=ERR %s
+
+; Diagnose register constraints that are not wide enough.
+
+; ERR: error: couldn't allocate output register for constraint '{v[8:15]}'
+define <9 x i32> @inline_asm_9xi32_in_8v_def() {
+ %asm = call <9 x i32> asm sideeffect "; def $0", "={v[8:15]}"()
+ ret <9 x i32> %asm
+}
+
+; ERR: error: couldn't allocate input reg for constraint '{v[8:15]}'
+define void @inline_asm_9xi32_in_8v_use(<9 x i32> %val) {
+ call void asm sideeffect "; use $0", "{v[8:15]}"(<9 x i32> %val)
+ ret void
+}
+
+; ERR: error: couldn't allocate output register for constraint '{s[8:15]}'
+define <9 x i32> @inline_asm_9xi32_in_8s_def() {
+ %asm = call <9 x i32> asm sideeffect "; def $0", "={s[8:15]}"()
+ ret <9 x i32> %asm
+}
+
+
+; Diagnose register constraints that are too wide.
+
+; ERR: error: couldn't allocate output register for constraint '{v[8:16]}'
+define <8 x i32> @inline_asm_8xi32_in_9v_def() {
+ %asm = call <8 x i32> asm sideeffect "; def $0", "={v[8:16]}"()
+ ret <8 x i32> %asm
+}
+
+; ERR: error: couldn't allocate input reg for constraint '{v[8:16]}'
+define void @inline_asm_8xi32_in_9v_use(<8 x i32> %val) {
+ call void asm sideeffect "; use $0", "{v[8:16]}"(<8 x i32> %val)
+ ret void
+}
+
+; ERR: error: couldn't allocate output register for constraint '{s[8:16]}'
+define <8 x i32> @inline_asm_8xi32_in_9s_def() {
+ %asm = call <8 x i32> asm sideeffect "; def $0", "={s[8:16]}"()
+ ret <8 x i32> %asm
+}
+
+
+; Diagnose mismatched scalars with register ranges
+
+; ERR: error: couldn't allocate output register for constraint '{s[4:5]}'
+define void @inline_asm_scalar_read_too_wide() {
+ %asm = call i32 asm sideeffect "; def $0 ", "={s[4:5]}"()
+ ret void
+}
+
+; ERR: error: couldn't allocate output register for constraint '{s[4:4]}'
+define void @inline_asm_scalar_read_too_narrow() {
+ %asm = call i64 asm sideeffect "; def $0 ", "={s[4:4]}"()
+ ret void
+}
+
+
+; Be more lenient with single registers that are too wide for the IR type:
+
+; ERR-NOT: error
+define i16 @inline_asm_i16_in_v_def() {
+ %asm = call i16 asm sideeffect "; def $0", "={v8}"()
+ ret i16 %asm
+}
+
+; ERR-NOT: error
+define void @inline_asm_i16_in_v_use(i16 %val) {
+ call void asm sideeffect "; use $0", "{v8}"(i16 %val)
+ ret void
+}
+
+; ERR-NOT: error
+define i16 @inline_asm_i16_in_s_def() {
+ %asm = call i16 asm sideeffect "; def $0", "={s8}"()
+ ret i16 %asm
+}
+
+; ERR-NOT: error
+define i8 @inline_asm_i8_in_v_def() {
+ %asm = call i8 asm sideeffect "; def $0", "={v8}"()
+ ret i8 %asm
+}
+
+; ERR-NOT: error
+define void @inline_asm_i8_in_v_use(i8 %val) {
+ call void asm sideeffect "; use $0", "{v8}"(i8 %val)
+ ret void
+}
+
+; ERR-NOT: error
+define i8 @inline_asm_i8_in_s_def() {
+ %asm = call i8 asm sideeffect "; def $0", "={s8}"()
+ ret i8 %asm
+}
----------------
arsenm wrote:
These not error cases need codegen checks, maybe best to split the test into an error and non-error version
https://github.com/llvm/llvm-project/pull/109955
More information about the llvm-commits
mailing list