The 'p' constraint produces an address operand that should only be printed with the 'a' modifier (e.g., %a0). Without it, GCC and Clang produce different and arguably incorrect output https://github.com/llvm/llvm-project/issues/185343#issuecomment-4029670370 Reject the combination to catch misuse early.
28 lines
947 B
LLVM
28 lines
947 B
LLVM
; RUN: not llc < %s -mtriple=x86_64-unknown-unknown 2>&1 | FileCheck %s
|
|
|
|
; CHECK: error: invalid operand in inline asm: 'mov %ah, ${0:h}'
|
|
define void @test1() {
|
|
entry:
|
|
%0 = tail call i8 asm sideeffect "mov %ah, ${0:h}", "=r,~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()
|
|
ret void
|
|
}
|
|
|
|
; CHECK: error: invalid operand in inline asm: '#TEST $0'
|
|
define void @test_p_no_modifier(ptr %p) {
|
|
call void asm sideeffect "#TEST $0", "p,~{dirflag},~{fpsr},~{flags}"(ptr %p)
|
|
ret void
|
|
}
|
|
|
|
; CHECK: error: invalid operand in inline asm: '#TEST ${0:a}'
|
|
define void @test_a_m(ptr %p) {
|
|
call void asm sideeffect "#TEST ${0:a}", "*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %p)
|
|
ret void
|
|
}
|
|
|
|
;CHECK: error: invalid operand in inline asm: 'vmovd ${1:k}, $0'
|
|
define i32 @foo() {
|
|
entry:
|
|
%0 = tail call i32 asm sideeffect "vmovd ${1:k}, $0", "=r,x,~{dirflag},~{fpsr},~{flags}"(<2 x i64> <i64 240518168632, i64 240518168632>)
|
|
ret i32 %0
|
|
}
|