aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShih-wei Liao <sliao@google.com>2012-08-05 23:47:54 -0700
committerShih-wei Liao <sliao@google.com>2012-08-05 23:47:54 -0700
commitdbfe3fabb0b82d9c73e4a48a0bc3ebb6a9cda593 (patch)
tree1fa2dc02fbbf1016b364ce5cd5610595dea3b74c
parent0a813a3ef2a82f19d7eab9e23ae8493197143803 (diff)
downloadandroid_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.cpp29
-rw-r--r--BitWriter_2_9/BitcodeWriterPass.cpp61
-rw-r--r--BitWriter_2_9_func/BitcodeWriter.cpp29
-rw-r--r--BitWriter_2_9_func/BitcodeWriterPass.cpp61
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) {