llvm-project/llvm/test/CodeGen/X86/asm-modifier-error.ll
Fangrui Song d6246f650f
[X86] Reject 'p' constraint without 'a' modifier in inline asm (#185799)
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.
2026-03-14 11:11:29 -07:00

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
}