Implement a signficant optimization for inline asm:
authorChris Lattner <sabre@nondot.org>
Sun, 27 Apr 2008 00:37:18 +0000 (00:37 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 27 Apr 2008 00:37:18 +0000 (00:37 +0000)
commit5a09690446a36f94f990db7d18d9b9ac8587888a
tree4ea3e1952e67a7ec106e63b63ad6996a7f3d6ab6
parent507ffd2423cfd0f5204c69e44c50aa3c759609d8
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50315 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/CodeGen/SelectionDAG/TargetLowering.cpp
lib/Transforms/Scalar/CodeGenPrepare.cpp
test/CodeGen/PowerPC/2007-04-24-InlineAsm-I-Modifier.ll
test/CodeGen/X86/2008-04-26-Asm-Optimize-Imm.ll [new file with mode: 0644]