source: icGREP/icgrep-devel/icgrep/pablo/pe_pabloe.cpp @ 4200

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

Replaced dynamic_cast with llvm::dyn_cast in pablo code; implemented make functions for pablo constructors. Disabled RTTI.

File size: 3.2 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 "pe_pabloe.h"
8#include "pe_advance.h"
9#include "pe_all.h"
10#include "pe_and.h"
11#include "pe_call.h"
12#include "pe_charclass.h"
13#include "pe_matchstar.h"
14#include "pe_not.h"
15#include "pe_or.h"
16#include "pe_pabloe.h"
17#include "pe_scanthru.h"
18#include "pe_sel.h"
19#include "pe_var.h"
20#include "pe_xor.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 PabloE * expr1, const PabloE * expr2) {
33    if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
34        if (const All * all1 = dyn_cast<const All>(expr1)) {
35            if (const All * all2 = cast<const All>(expr2)) {
36                return all1->getValue() == all2->getValue();
37            }
38        }
39        else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
40            if (const Var * var2 = cast<const Var>(expr2)) {
41                return (var1->getVar() == var2->getVar());
42            }
43        }
44        else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
45            if (const Not* not2 = cast<const Not>(expr2)) {
46                return equals(not1->getExpr(), not2->getExpr());
47            }
48        }
49        else if (const And* and1 = dyn_cast<const And>(expr1)) {
50            if (const And* and2 = cast<const And>(expr2)) {
51                if (equals(and1->getExpr1(), and2->getExpr1())) {
52                    return equals(and1->getExpr2(), and2->getExpr2());
53                }
54                else if (equals(and1->getExpr1(), and2->getExpr2())) {
55                    return equals(and1->getExpr2(), and2->getExpr1());
56                }
57            }
58        }
59        else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
60            if (const Or* or2 = cast<const Or>(expr2)) {
61                if (equals(or1->getExpr1(), or2->getExpr1())) {
62                    return equals(or1->getExpr2(), or2->getExpr2());
63                }
64                else if (equals(or1->getExpr1(), or2->getExpr2())) {
65                    return equals(or1->getExpr2(), or2->getExpr1());
66                }
67            }
68        }
69        else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
70            if (const Xor * xor2 = cast<const Xor>(expr2)) {
71                if (equals(xor1->getExpr1(), xor2->getExpr1())) {
72                    return equals(xor1->getExpr2(), xor2->getExpr2());
73                }
74                else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
75                    return equals(xor1->getExpr2(), xor2->getExpr1());
76                }
77            }
78        }
79        else if (const Sel* sel1 = dyn_cast<const Sel>(expr1)) {
80            if (const Sel* sel2 = cast<const Sel>(expr2)) {
81                if (equals(sel1->getIf_expr(), sel2->getIf_expr())) {
82                    if (equals(sel1->getT_expr(), sel2->getT_expr())) {
83                        return equals(sel1->getF_expr(), sel2->getF_expr());
84                    }
85                }
86            }
87        }
88    }
89    return false;
90}
91
92
93
94PabloE::~PabloE(){ }
95
96
97
98}
Note: See TracBrowser for help on using the repository browser.