source: icGREP/icgrep-devel/icgrep/pablo/pabloAST.cpp @ 4252

Last change on this file since 4252 was 4252, checked in by nmedfort, 5 years ago

Transitory check-in; initial integration of pablo Next nodes and enforcement of SSA form for all Assign nodes.

File size: 3.1 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "pabloAST.h"
8#include "pe_advance.h"
9#include "pe_and.h"
10#include "pe_call.h"
11#include "pe_matchstar.h"
12#include "pe_not.h"
13#include "pe_or.h"
14#include "pabloAST.h"
15#include "pe_scanthru.h"
16#include "pe_sel.h"
17#include "pe_var.h"
18#include "pe_xor.h"
19#include "pe_zeroes.h"
20#include "pe_ones.h"
21
22namespace pablo {
23
24/*
25
26    Return true if expr1 and expr2 can be proven equivalent according to some rules,
27    false otherwise.  Note that false may be returned i some cases when the exprs are
28    equivalent.
29
30*/
31
32bool equals(const PabloAST * expr1, const PabloAST * expr2) {
33    if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
34        if ((isa<const Zeroes>(expr1)) || (isa<const Ones>(expr1))) {
35            return true;
36        }
37        else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
38            if (const Var * var2 = cast<const Var>(expr2)) {
39                return (var1->getName() == var2->getName());
40            }
41        }
42        else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
43            if (const Not* not2 = cast<const Not>(expr2)) {
44                return equals(not1->getExpr(), not2->getExpr());
45            }
46        }
47        else if (const And* and1 = dyn_cast<const And>(expr1)) {
48            if (const And* and2 = cast<const And>(expr2)) {
49                if (equals(and1->getExpr1(), and2->getExpr1())) {
50                    return equals(and1->getExpr2(), and2->getExpr2());
51                }
52                else if (equals(and1->getExpr1(), and2->getExpr2())) {
53                    return equals(and1->getExpr2(), and2->getExpr1());
54                }
55            }
56        }
57        else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
58            if (const Or* or2 = cast<const Or>(expr2)) {
59                if (equals(or1->getExpr1(), or2->getExpr1())) {
60                    return equals(or1->getExpr2(), or2->getExpr2());
61                }
62                else if (equals(or1->getExpr1(), or2->getExpr2())) {
63                    return equals(or1->getExpr2(), or2->getExpr1());
64                }
65            }
66        }
67        else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
68            if (const Xor * xor2 = cast<const Xor>(expr2)) {
69                if (equals(xor1->getExpr1(), xor2->getExpr1())) {
70                    return equals(xor1->getExpr2(), xor2->getExpr2());
71                }
72                else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
73                    return equals(xor1->getExpr2(), xor2->getExpr1());
74                }
75            }
76        }
77        else if (const Sel* sel1 = dyn_cast<const Sel>(expr1)) {
78            if (const Sel* sel2 = cast<const Sel>(expr2)) {
79                if (equals(sel1->getCondition(), sel2->getCondition())) {
80                    if (equals(sel1->getTrueExpr(), sel2->getTrueExpr())) {
81                        return equals(sel1->getFalseExpr(), sel2->getFalseExpr());
82                    }
83                }
84            }
85        }
86    }
87    return false;
88}
89
90}
Note: See TracBrowser for help on using the repository browser.