blob: b6f4bc7da1dd87239aa470e9f0c6102050e24073 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _INSERTPI_H
#define _INSERTPI_H
#include <iostream>
#include "abcdbounds.h"
#include "FlowGraph.h"
#include "Opcode.h"
#include "open/types.h"
#include "opndmap.h"
namespace Jitrino {
class InsertPi {
public:
InsertPi(MemoryManager& mm, DominatorTree& dom_tree, IRManager& irm,
bool use_aliases) :
_mm(mm),
_domTree(dom_tree),
_useAliases(use_aliases),
_irManager(irm),
_blockTauEdge(0),
_lastTauEdgeBlock(0),
_piMap(0)
{}
// Add a Pi node in the node if it is after each test
// which tells something about a variable
void insertPi();
void removePi();
void setUseAliases(bool use = true) { _useAliases = use; }
bool useAliases() const { return _useAliases; }
private:
friend class InsertPiWalker;
friend class RenamePiWalker;
friend class RemovePiWalker;
// add Pi in the node iff after a test which tells something about the var
void insertPiToNode(Node* block);
// definition: PEI=Potentially Excepting Instruction
void insertPiForUnexceptionalPEI(Node *block, Inst *lasti);
SsaTmpOpnd* getBlockTauEdge(Node *block);
void insertPiForBranch(Node* block,
BranchInst* branchi,
Edge::Kind kind);
void insertPiForComparison(Node* block,
ComparisonModifier mod,
const PiCondition& bounds,
Opnd* op,
bool swap_operands,
bool negate_comparison);
void insertPiForOpnd(Node* block,
Opnd* org,
const PiCondition &cond,
Opnd* tauOpnd);
// checks for aliases of opnd, inserts them.
void insertPiForOpndAndAliases(Node* block,
Opnd* org,
const PiCondition& cond,
Opnd* tauOpnd);
bool getAliases(Opnd *opnd, AbcdAliases *aliases, int64 addend);
Opnd* getConstantOpnd(Opnd *opnd);
// Renames variables for which we have Pi nodes.
void renamePiVariables();
void renamePiVariablesInNode(Node *block);
void renamePiVariablesInDomNode(DominatorNode *block);
void removePiOnInst(Node* block, Inst *inst);
MemoryManager& _mm;
DominatorTree& _domTree;
bool _useAliases;
IRManager& _irManager;
SsaTmpOpnd* _blockTauEdge;
Node* _lastTauEdgeBlock;
SparseOpndMap *_piMap;
};
} //namespace Jitrino
#endif /* _INSERTPI_H */