diff options
author | Chris Lattner <sabre@nondot.org> | 2008-03-02 03:57:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-03-02 03:57:08 +0000 |
commit | a5f0bc07fa0d57a199c32d3b87bc695a30acaed8 (patch) | |
tree | c46891fdc454d6ad2b23c6f72e199785beaefed1 | |
parent | f41a794f36dadb45681f946fac9b1feeb2c3ba73 (diff) | |
download | external_llvm-a5f0bc07fa0d57a199c32d3b87bc695a30acaed8.zip external_llvm-a5f0bc07fa0d57a199c32d3b87bc695a30acaed8.tar.gz external_llvm-a5f0bc07fa0d57a199c32d3b87bc695a30acaed8.tar.bz2 |
implement extractelement.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47812 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index bdef34d..5e98798 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -191,8 +191,10 @@ namespace { // Don't inline a load across a store or other bad things! return false; - // Must not be used in inline asm - if (I.hasOneUse() && isInlineAsm(*I.use_back())) return false; + // Must not be used in inline asm or extractelement. + if (I.hasOneUse() && + (isInlineAsm(*I.use_back()) || isa<ExtractElementInst>(I))) + return false; // Only inline instruction it if it's use is in the same BB as the inst. return I.getParent() == cast<Instruction>(I.use_back())->getParent(); @@ -253,6 +255,7 @@ namespace { void visitVAArgInst (VAArgInst &I); void visitInsertElementInst(InsertElementInst &I); + void visitExtractElementInst(ExtractElementInst &I); void visitInstruction(Instruction &I) { cerr << "C Writer does not know about " << I; @@ -3037,6 +3040,18 @@ void CWriter::visitInsertElementInst(InsertElementInst &I) { Out << ")"; } +void CWriter::visitExtractElementInst(ExtractElementInst &I) { + // We know that our operand is not inlined. + Out << "(("; + const Type *EltTy = + cast<VectorType>(I.getOperand(0)->getType())->getElementType(); + printType(Out, PointerType::getUnqual(EltTy)); + Out << ")(&" << GetValueName(I.getOperand(0)) << "))["; + writeOperand(I.getOperand(1)); + Out << "]"; +} + + //===----------------------------------------------------------------------===// // External Interface declaration |