summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-27 00:37:18 +0000
committerChris Lattner <sabre@nondot.org>2008-04-27 00:37:18 +0000
commit22379734384ab2548659ef782f16779c5c041264 (patch)
tree729996d5f3c1cabe14fc6ee33b66081f9061b15f /llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll
parenta937baeb9b192266efa58f410cc8d8051c17d598 (diff)
downloadbcm5719-llvm-22379734384ab2548659ef782f16779c5c041264.tar.gz
bcm5719-llvm-22379734384ab2548659ef782f16779c5c041264.zip
Implement a signficant optimization for inline asm:
When choosing between constraints with multiple options, like "ir", test to see if we can use the 'i' constraint and go with that if possible. This produces more optimal ASM in all cases (sparing a register and an instruction to load it), and fixes inline asm like this: void test () { asm volatile (" %c0 %1 " : : "imr" (42), "imr"(14)); } Previously we would dump "42" into a memory location (which is ok for the 'm' constraint) which would cause a problem because the 'c' modifier is not valid on memory operands. Isn't it great how inline asm turns 'missed optimization' into 'compile failed'?? Incidentally, this was the todo in PowerPC/2007-04-24-InlineAsm-I-Modifier.ll Please do NOT pull this into Tak. llvm-svn: 50315
Diffstat (limited to 'llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll')
-rw-r--r--llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll b/llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll
new file mode 100644
index 00000000000..82721a53b8b
--- /dev/null
+++ b/llvm/test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll
@@ -0,0 +1,11 @@
+; RUN: llvm-as < %s | llc | grep {1 \$2 3}
+; rdar://5720231
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+target triple = "i386-apple-darwin8"
+
+define void @test() nounwind {
+entry:
+ tail call void asm sideeffect " ${0:c} $1 ${2:c} ", "imr,imr,i,~{dirflag},~{fpsr},~{flags}"( i32 1, i32 2, i32 3 ) nounwind
+ ret void
+}
+
OpenPOWER on IntegriCloud