// Let-variable, function parameter, or self-variable
enum VariableKind {
VK_Let,
+ VK_LetBB,
VK_Fun,
VK_SFun
};
unsigned getID() const { return Id; }
unsigned getBlockID() const { return BlockID; }
+ void setName(StringRef S) { Name = S; }
void setID(unsigned Bid, unsigned I) {
BlockID = static_cast<unsigned short>(Bid);
Id = static_cast<unsigned short>(I);
// Add a new argument. V must define a phi-node.
void addArgument(Variable *V) {
+ V->setKind(Variable::VK_LetBB);
Args.reserveCheck(1, Arena);
Args.push_back(V);
}
// Add a new instruction.
void addInstruction(Variable *V) {
+ V->setKind(Variable::VK_LetBB);
Instrs.reserveCheck(1, Arena);
Instrs.push_back(V);
}
class PrettyPrinter {
private:
bool Verbose; // Print out additional information
+ bool Cleanup; // Omit redundant decls.
public:
- PrettyPrinter(bool V = false) : Verbose(V) { }
+ PrettyPrinter(bool V = false, bool C = true) : Verbose(V), Cleanup(C) { }
static void print(SExpr *E, StreamType &SS) {
Self printer;
SS << "\n";
}
- void printBlockLabel(StreamType & SS, BasicBlock *BB, unsigned index) {
- if (!BB) {
- SS << "BB_null";
- return;
- }
- SS << "BB_";
- SS << BB->blockID();
- SS << ":";
- SS << index;
- }
-
// TODO: further distinguish between binary operations.
static const unsigned Prec_Atom = 0;
static const unsigned Prec_Postfix = 1;
return Prec_MAX;
}
+ void printBlockLabel(StreamType & SS, BasicBlock *BB, unsigned index) {
+ if (!BB) {
+ SS << "BB_null";
+ return;
+ }
+ SS << "BB_";
+ SS << BB->blockID();
+ SS << ":";
+ SS << index;
+ }
+
void printSExpr(SExpr *E, StreamType &SS, unsigned P) {
if (!E) {
self()->printNull(SS);
}
void printVariable(Variable *V, StreamType &SS, bool IsVarDecl = false) {
- SExpr* E = nullptr;
- if (!IsVarDecl) {
- E = getCanonicalVal(V);
+ if (!IsVarDecl && Cleanup) {
+ SExpr* E = getCanonicalVal(V);
if (E != V) {
printSExpr(E, SS, Prec_Atom);
- if (Verbose) {
- SS << " /*";
- SS << V->name() << V->getBlockID() << "_" << V->getID();
- SS << "*/";
- }
return;
}
}
- SS << V->name() << V->getBlockID() << "_" << V->getID();
+ if (V->kind() == Variable::VK_LetBB)
+ SS << V->name() << V->getBlockID() << "_" << V->getID();
+ else
+ SS << V->name() << V->getID();
}
void printFunction(Function *E, StreamType &SS, unsigned sugared = 0) {