Internals: Cleanup some slice code. No functional change.

This commit is contained in:
Wilson Snyder 2016-07-21 23:07:22 -04:00
parent 8ee94dd7aa
commit ae38a26af3
1 changed files with 28 additions and 37 deletions

View File

@ -139,37 +139,34 @@ class SliceCloneVisitor : public AstNVisitor {
UINFO(4, "Cloning "<<nodep->user2()<<" times: "<<nodep<<endl); UINFO(4, "Cloning "<<nodep->user2()<<" times: "<<nodep<<endl);
AstNode* lhsp = NULL; AstNode* lhsp = NULL;
AstNode* rhsp = NULL;
for (int i = 0; i < nodep->user2(); ++i) { for (int i = 0; i < nodep->user2(); ++i) {
// Clone the node and iterate over the clone // Clone the node and iterate over the clone
m_vecIdx = -1; m_vecIdx = -1;
AstNodeUniop* clonep = nodep->cloneTree(false)->castNodeUniop(); AstNodeUniop* clonep = nodep->cloneTree(false)->castNodeUniop();
clonep->iterateChildren(*this); clonep->iterateChildren(*this);
if (!lhsp) lhsp = clonep; if (!lhsp) lhsp = clonep;
else rhsp = clonep; else {
if (lhsp && rhsp) {
switch (nodep->type()) { switch (nodep->type()) {
case AstType::atREDOR: case AstType::atREDOR:
lhsp = new AstOr(nodep->fileline(), lhsp, rhsp); lhsp = new AstOr(nodep->fileline(), lhsp, clonep);
break; break;
case AstType::atREDAND: case AstType::atREDAND:
lhsp = new AstAnd(nodep->fileline(), lhsp, rhsp); lhsp = new AstAnd(nodep->fileline(), lhsp, clonep);
break; break;
case AstType::atREDXOR: case AstType::atREDXOR:
lhsp = new AstXor(nodep->fileline(), lhsp, rhsp); lhsp = new AstXor(nodep->fileline(), lhsp, clonep);
break; break;
case AstType::atREDXNOR: case AstType::atREDXNOR:
lhsp = new AstXnor(nodep->fileline(), lhsp, rhsp); lhsp = new AstXnor(nodep->fileline(), lhsp, clonep);
break; break;
default: default:
nodep->v3fatalSrc("Unsupported: Unary operation on multiple packed dimensions"); nodep->v3fatalSrc("Unsupported: Unary operation on multiple packed dimensions");
break; break;
} }
rhsp = NULL;
} }
} }
nodep->addNextHere(lhsp); nodep->replaceWith(lhsp);
nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep); nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstRedOr* nodep, AstNUser*) { virtual void visit(AstRedOr* nodep, AstNUser*) {
cloneUniop(nodep); cloneUniop(nodep);
@ -441,6 +438,7 @@ class SliceVisitor : public AstNVisitor {
} }
void expandUniOp(AstNodeUniop* nodep) { void expandUniOp(AstNodeUniop* nodep) {
if (!nodep->user1()) {
nodep->user1(true); nodep->user1(true);
unsigned dim = 0; unsigned dim = 0;
if (AstArraySel* selp = nodep->lhsp()->castArraySel()) { if (AstArraySel* selp = nodep->lhsp()->castArraySel()) {
@ -459,26 +457,19 @@ class SliceVisitor : public AstNVisitor {
} }
} }
} }
virtual void visit(AstRedOr* nodep, AstNUser*) {
if (!nodep->user1()) {
expandUniOp(nodep);
} }
virtual void visit(AstRedOr* nodep, AstNUser*) {
expandUniOp(nodep);
} }
virtual void visit(AstRedAnd* nodep, AstNUser*) { virtual void visit(AstRedAnd* nodep, AstNUser*) {
if (!nodep->user1()) {
expandUniOp(nodep); expandUniOp(nodep);
} }
}
virtual void visit(AstRedXor* nodep, AstNUser*) { virtual void visit(AstRedXor* nodep, AstNUser*) {
if (!nodep->user1()) {
expandUniOp(nodep); expandUniOp(nodep);
} }
}
virtual void visit(AstRedXnor* nodep, AstNUser*) { virtual void visit(AstRedXnor* nodep, AstNUser*) {
if (!nodep->user1()) {
expandUniOp(nodep); expandUniOp(nodep);
} }
}
virtual void visit(AstNode* nodep, AstNUser*) { virtual void visit(AstNode* nodep, AstNUser*) {
// Default: Just iterate // Default: Just iterate