001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package EDU.purdue.cs.bloat.tree;
022:
023: import EDU.purdue.cs.bloat.cfg.*;
024:
025: /**
026: * Swizzler represents an induction variable that is used as an index into an
027: * array. Analysis can be done to determine if array swizzle (aswizzle)
028: * instruction(s) can be hoisted out of the loop.
029: *
030: * @see EDU.purdue.cs.bloat.diva.InductionVarAnalyzer InductionVarAnalyzer
031: */
032: public class Swizzler {
033: Expr ind_var; // induction variable (iv)
034:
035: Expr target; // target of the phi defining the ind_var
036:
037: Expr init_val; // initial value of the iv
038:
039: Expr end_val; // terminating value of the iv
040:
041: Expr array; // arrayref which uses the iv as the index
042:
043: Block phi_block; // block of the phi defining the ind_var
044:
045: SCStmt aswizzle; // the aswizzle stmt that could be removed
046:
047: /**
048: * Constructor.
049: *
050: * @param var
051: * Induction variable. (An index variable for an array.)
052: * @param tgt
053: * Target of the phi statement that defines the induction
054: * variable.
055: * @param val
056: * Initial value of the induction variable.
057: * @param phiblock
058: * The block in which the phi statement resides.
059: */
060: public Swizzler(final Expr var, final Expr tgt, final Expr val,
061: final Block phiblock) {
062: this .ind_var = var;
063: this .target = tgt;
064: this .init_val = val;
065: this .end_val = null;
066: this .array = null;
067: this .phi_block = phiblock;
068: this .aswizzle = null;
069: }
070:
071: /**
072: * Sets the ending value for the induction variable.
073: *
074: * @param end
075: * The final value the induction variable will take on.
076: */
077: public void set_end_val(final Expr end) {
078: this .end_val = end;
079: }
080:
081: /**
082: * @param a
083: * The array that is indexed by the induction variable.
084: */
085: public void set_array(final Expr a) {
086: this .array = a;
087: }
088:
089: /**
090: * @param sc
091: * The aswizzle statement that could be removed from the block.
092: */
093: public void set_aswizzle(final SCStmt sc) {
094: this .aswizzle = sc;
095: }
096:
097: public Expr ind_var() {
098: return ind_var;
099: }
100:
101: public Expr target() {
102: return target;
103: }
104:
105: public Expr init_val() {
106: return init_val;
107: }
108:
109: public Expr end_val() {
110: return end_val;
111: }
112:
113: public Expr array() {
114: return array;
115: }
116:
117: public Block phi_block() {
118: return phi_block;
119: }
120:
121: public SCStmt aswizzle() {
122: return aswizzle;
123: }
124: }
|