[llvm] [Clang][inlineasm] Add special support for "rm" output constraints (PR #92040)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 25 09:54:34 PDT 2024


================
@@ -0,0 +1,363 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter "^\t#" --version 4
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O2 -regalloc=greedy < %s | FileCheck --check-prefix=GREEDY-X86_64 %s
+; RUN: llc -mtriple=i386-unknown-linux-gnu -O2 -regalloc=greedy   < %s | FileCheck --check-prefix=GREEDY-I386 %s
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O2 -regalloc=basic  < %s | FileCheck --check-prefix=BASIC-X86_64 %s
+; RUN: llc -mtriple=i386-unknown-linux-gnu -O2 -regalloc=basic    < %s | FileCheck --check-prefix=BASIC-I386 %s
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O2 -regalloc=fast   < %s | FileCheck --check-prefix=FAST-X86_64 %s
+; RUN: llc -mtriple=i386-unknown-linux-gnu -O2 -regalloc=fast     < %s | FileCheck --check-prefix=FAST-I386 %s
+
+; The Greedy register allocator should use registers when there isn't register
+; pressure.
+
+define dso_local i32 @test1(ptr nocapture noundef readonly %ptr) local_unnamed_addr #0 {
+; GREEDY-X86_64-LABEL: test1:
+; GREEDY-X86_64:    #APP
+; GREEDY-X86_64:    # 'rm' input no pressure -> %eax %ecx
+; GREEDY-X86_64:    #NO_APP
+;
+; GREEDY-I386-LABEL: test1:
+; GREEDY-I386:    #APP
+; GREEDY-I386:    # 'rm' input no pressure -> %ecx %edx
+; GREEDY-I386:    #NO_APP
+;
+; BASIC-X86_64-LABEL: test1:
+; BASIC-X86_64:    #APP
+; BASIC-X86_64:    # 'rm' input no pressure -> -{{[0-9]+}}(%rsp) -{{[0-9]+}}(%rsp)
+; BASIC-X86_64:    #NO_APP
+;
+; BASIC-I386-LABEL: test1:
+; BASIC-I386:    #APP
+; BASIC-I386:    # 'rm' input no pressure -> {{[0-9]+}}(%esp) (%esp)
+; BASIC-I386:    #NO_APP
+;
+; FAST-X86_64-LABEL: test1:
+; FAST-X86_64:    #APP
+; FAST-X86_64:    # 'rm' input no pressure -> -{{[0-9]+}}(%rsp) -{{[0-9]+}}(%rsp)
+; FAST-X86_64:    #NO_APP
+;
+; FAST-I386-LABEL: test1:
+; FAST-I386:    #APP
+; FAST-I386:    # 'rm' input no pressure -> {{[0-9]+}}(%esp) (%esp)
+; FAST-I386:    #NO_APP
+entry:
+  %b = getelementptr inbounds i8, ptr %ptr, i64 4
+  %0 = load i32, ptr %b, align 4
+  %d = getelementptr inbounds i8, ptr %ptr, i64 12
+  %1 = load i32, ptr %d, align 4
+  tail call void asm sideeffect "# 'rm' input no pressure -> $0 $1", "rm,rm,~{dirflag},~{fpsr},~{flags}"(i32 %0, i32 %1) #1
+  %2 = load i32, ptr %ptr, align 4
+  ret i32 %2
+}
+
+define dso_local i32 @test2(ptr nocapture noundef readonly %ptr) local_unnamed_addr #0 {
+; GREEDY-X86_64-LABEL: test2:
+; GREEDY-X86_64:    #APP # 8-byte Folded Reload
+; GREEDY-X86_64:    # 'rm' input pressure -> -{{[0-9]+}}(%rsp) -{{[0-9]+}}(%rsp)
+; GREEDY-X86_64:    #NO_APP
+;
+; GREEDY-I386-LABEL: test2:
+; GREEDY-I386:    #APP # 8-byte Folded Reload
+; GREEDY-I386:    # 'rm' input pressure -> {{[0-9]+}}(%esp) (%esp)
+; GREEDY-I386:    #NO_APP
+;
+; BASIC-X86_64-LABEL: test2:
+; BASIC-X86_64:    #APP
+; BASIC-X86_64:    # 'rm' input pressure -> -{{[0-9]+}}(%rsp) -{{[0-9]+}}(%rsp)
+; BASIC-X86_64:    #NO_APP
+;
+; BASIC-I386-LABEL: test2:
+; BASIC-I386:    #APP
+; BASIC-I386:    # 'rm' input pressure -> {{[0-9]+}}(%esp) (%esp)
+; BASIC-I386:    #NO_APP
+;
+; FAST-X86_64-LABEL: test2:
+; FAST-X86_64:    #APP
+; FAST-X86_64:    # 'rm' input pressure -> -{{[0-9]+}}(%rsp) -{{[0-9]+}}(%rsp)
+; FAST-X86_64:    #NO_APP
+;
+; FAST-I386-LABEL: test2:
+; FAST-I386:    #APP
+; FAST-I386:    # 'rm' input pressure -> {{[0-9]+}}(%esp) {{[0-9]+}}(%esp)
+; FAST-I386:    #NO_APP
+entry:
+  %b = getelementptr inbounds i8, ptr %ptr, i64 4
+  %0 = load i32, ptr %b, align 4
----------------
arsenm wrote:

No, they mostly use %some_string. opt -passes=instnamer or metarenamer will add names to everything for you 

https://github.com/llvm/llvm-project/pull/92040


More information about the llvm-commits mailing list