diff options
author | Shih-wei Liao <sliao@google.com> | 2012-08-05 23:47:54 -0700 |
---|---|---|
committer | Shih-wei Liao <sliao@google.com> | 2012-08-05 23:47:54 -0700 |
commit | dbfe3fabb0b82d9c73e4a48a0bc3ebb6a9cda593 (patch) | |
tree | 1fa2dc02fbbf1016b364ce5cd5610595dea3b74c | |
parent | 0a813a3ef2a82f19d7eab9e23ae8493197143803 (diff) | |
download | android_frameworks_compile_slang-dbfe3fabb0b82d9c73e4a48a0bc3ebb6a9cda593.tar.gz android_frameworks_compile_slang-dbfe3fabb0b82d9c73e4a48a0bc3ebb6a9cda593.tar.bz2 android_frameworks_compile_slang-dbfe3fabb0b82d9c73e4a48a0bc3ebb6a9cda593.zip |
Expand case range values for legacy BitcodeWriter.
Change-Id: I8a9319c751c37f42d90476fd8de213a9a10bd07d
-rw-r--r-- | BitWriter_2_9/BitcodeWriter.cpp | 29 | ||||
-rw-r--r-- | BitWriter_2_9/BitcodeWriterPass.cpp | 61 | ||||
-rw-r--r-- | BitWriter_2_9_func/BitcodeWriter.cpp | 29 | ||||
-rw-r--r-- | BitWriter_2_9_func/BitcodeWriterPass.cpp | 61 |
4 files changed, 170 insertions, 10 deletions
diff --git a/BitWriter_2_9/BitcodeWriter.cpp b/BitWriter_2_9/BitcodeWriter.cpp index 1c5f325..7d44020 100644 --- a/BitWriter_2_9/BitcodeWriter.cpp +++ b/BitWriter_2_9/BitcodeWriter.cpp @@ -1166,10 +1166,31 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, } break; case Instruction::Switch: - Code = bitc::FUNC_CODE_INST_SWITCH; - Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); - for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) - Vals.push_back(VE.getValueID(I.getOperand(i))); + { + Code = bitc::FUNC_CODE_INST_SWITCH; + SwitchInst &SI = cast<SwitchInst>(I); + + Vals.push_back(VE.getTypeID(SI.getCondition()->getType())); + Vals.push_back(VE.getValueID(SI.getCondition())); + Vals.push_back(VE.getValueID(SI.getDefaultDest())); + for (SwitchInst::CaseIt i = SI.case_begin(), e = SI.case_end(); + i != e; ++i) { + IntegersSubset& CaseRanges = i.getCaseValueEx(); + + if (CaseRanges.isSingleNumber()) { + Vals.push_back(VE.getValueID(CaseRanges.getSingleNumber(0).toConstantInt())); + Vals.push_back(VE.getValueID(i.getCaseSuccessor())); + } else if (CaseRanges.isSingleNumbersOnly()) { + for (unsigned ri = 0, rn = CaseRanges.getNumItems(); + ri != rn; ++ri) { + Vals.push_back(VE.getValueID(CaseRanges.getSingleNumber(ri).toConstantInt())); + Vals.push_back(VE.getValueID(i.getCaseSuccessor())); + } + } else { + llvm_unreachable("Not single number?"); + } + } + } break; case Instruction::IndirectBr: Code = bitc::FUNC_CODE_INST_INDIRECTBR; diff --git a/BitWriter_2_9/BitcodeWriterPass.cpp b/BitWriter_2_9/BitcodeWriterPass.cpp index df33de6..1ae4556 100644 --- a/BitWriter_2_9/BitcodeWriterPass.cpp +++ b/BitWriter_2_9/BitcodeWriterPass.cpp @@ -12,12 +12,17 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9.h" +#include "llvm/Function.h" +#include "llvm/Instructions.h" +#include "llvm/Module.h" #include "llvm/Pass.h" using namespace llvm; namespace { class WriteBitcodePass : public ModulePass { raw_ostream &OS; // raw_ostream to print on + + bool expandCaseRange(Function &F); public: static char ID; // Pass identification, replacement for typeid explicit WriteBitcodePass(raw_ostream &o) @@ -26,14 +31,68 @@ namespace { const char *getPassName() const { return "Bitcode Writer"; } bool runOnModule(Module &M) { + bool Changed = false; + for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) + if (!F->isDeclaration()) + Changed |= expandCaseRange(*F); + llvm_2_9::WriteBitcodeToFile(&M, OS); - return false; + return Changed; } }; } char WriteBitcodePass::ID = 0; +/// expandCaseRange - Expand case range into explicit case values within the +/// range +bool WriteBitcodePass::expandCaseRange(Function &F) { + bool Changed = false; + + for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { + SwitchInst *SI = dyn_cast<SwitchInst>(BB->getTerminator()); + if (SI == NULL) { + continue; + } + + for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end(); + i != e; ++i) { + IntegersSubset& CaseRanges = i.getCaseValueEx(); + + // All case ranges are already in single case values + if (CaseRanges.isSingleNumbersOnly()) { + continue; + } + + // Create a new case + Type *IntTy = SI->getCondition()->getType(); + IntegersSubsetToBB CaseBuilder; + Changed = true; + + for (unsigned ri = 0, rn = CaseRanges.getNumItems(); ri != rn; ++ri) { + IntegersSubset::Range r = CaseRanges.getItem(ri); + bool IsSingleNumber = CaseRanges.isSingleNumber(ri); + + if (IsSingleNumber) { + CaseBuilder.add(r); + } else { + const APInt &Low = r.getLow(); + const APInt &High = r.getHigh(); + + for (APInt V = Low; V != High; V++) { + assert(r.isInRange(V) && "Unexpected out-of-range case value!"); + CaseBuilder.add(IntItem::fromType(IntTy, V)); + } + } + + IntegersSubset Case = CaseBuilder.getCase(); + i.setValueEx(Case); + } + } + } + return Changed; +} + /// createBitcodeWriterPass - Create and return a pass that writes the module /// to the specified ostream. llvm::ModulePass *llvm_2_9::createBitcodeWriterPass(llvm::raw_ostream &Str) { diff --git a/BitWriter_2_9_func/BitcodeWriter.cpp b/BitWriter_2_9_func/BitcodeWriter.cpp index 9a37aab..d2aa71f 100644 --- a/BitWriter_2_9_func/BitcodeWriter.cpp +++ b/BitWriter_2_9_func/BitcodeWriter.cpp @@ -1120,10 +1120,31 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, } break; case Instruction::Switch: - Code = bitc::FUNC_CODE_INST_SWITCH; - Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); - for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) - Vals.push_back(VE.getValueID(I.getOperand(i))); + { + Code = bitc::FUNC_CODE_INST_SWITCH; + SwitchInst &SI = cast<SwitchInst>(I); + + Vals.push_back(VE.getTypeID(SI.getCondition()->getType())); + Vals.push_back(VE.getValueID(SI.getCondition())); + Vals.push_back(VE.getValueID(SI.getDefaultDest())); + for (SwitchInst::CaseIt i = SI.case_begin(), e = SI.case_end(); + i != e; ++i) { + IntegersSubset& CaseRanges = i.getCaseValueEx(); + + if (CaseRanges.isSingleNumber()) { + Vals.push_back(VE.getValueID(CaseRanges.getSingleNumber(0).toConstantInt())); + Vals.push_back(VE.getValueID(i.getCaseSuccessor())); + } else if (CaseRanges.isSingleNumbersOnly()) { + for (unsigned ri = 0, rn = CaseRanges.getNumItems(); + ri != rn; ++ri) { + Vals.push_back(VE.getValueID(CaseRanges.getSingleNumber(ri).toConstantInt())); + Vals.push_back(VE.getValueID(i.getCaseSuccessor())); + } + } else { + llvm_unreachable("Not single number?"); + } + } + } break; case Instruction::IndirectBr: Code = bitc::FUNC_CODE_INST_INDIRECTBR; diff --git a/BitWriter_2_9_func/BitcodeWriterPass.cpp b/BitWriter_2_9_func/BitcodeWriterPass.cpp index adc9dc0..1bd6cd0 100644 --- a/BitWriter_2_9_func/BitcodeWriterPass.cpp +++ b/BitWriter_2_9_func/BitcodeWriterPass.cpp @@ -12,12 +12,17 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9_func.h" +#include "llvm/Function.h" +#include "llvm/Instructions.h" +#include "llvm/Module.h" #include "llvm/Pass.h" using namespace llvm; namespace { class WriteBitcodePass : public ModulePass { raw_ostream &OS; // raw_ostream to print on + + bool expandCaseRange(Function &F); public: static char ID; // Pass identification, replacement for typeid explicit WriteBitcodePass(raw_ostream &o) @@ -26,14 +31,68 @@ namespace { const char *getPassName() const { return "Bitcode Writer"; } bool runOnModule(Module &M) { + bool Changed = false; + for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) + if (!F->isDeclaration()) + Changed |= expandCaseRange(*F); + llvm_2_9_func::WriteBitcodeToFile(&M, OS); - return false; + return Changed; } }; } char WriteBitcodePass::ID = 0; +/// expandCaseRange - Expand case range into explicit case values within the +/// range +bool WriteBitcodePass::expandCaseRange(Function &F) { + bool Changed = false; + + for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { + SwitchInst *SI = dyn_cast<SwitchInst>(BB->getTerminator()); + if (SI == NULL) { + continue; + } + + for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end(); + i != e; ++i) { + IntegersSubset& CaseRanges = i.getCaseValueEx(); + + // All case ranges are already in single case values + if (CaseRanges.isSingleNumbersOnly()) { + continue; + } + + // Create a new case + Type *IntTy = SI->getCondition()->getType(); + IntegersSubsetToBB CaseBuilder; + Changed = true; + + for (unsigned ri = 0, rn = CaseRanges.getNumItems(); ri != rn; ++ri) { + IntegersSubset::Range r = CaseRanges.getItem(ri); + bool IsSingleNumber = CaseRanges.isSingleNumber(ri); + + if (IsSingleNumber) { + CaseBuilder.add(r); + } else { + const APInt &Low = r.getLow(); + const APInt &High = r.getHigh(); + + for (APInt V = Low; V != High; V++) { + assert(r.isInRange(V) && "Unexpected out-of-range case value!"); + CaseBuilder.add(IntItem::fromType(IntTy, V)); + } + } + + IntegersSubset Case = CaseBuilder.getCase(); + i.setValueEx(Case); + } + } + } + return Changed; +} + /// createBitcodeWriterPass - Create and return a pass that writes the module /// to the specified ostream. llvm::ModulePass *llvm_2_9_func::createBitcodeWriterPass(llvm::raw_ostream &Str) { |