blob: 9113ffcfafe7eb09caed9c0b1da049921e786694 [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.
*/
/**
* @author Intel, Mikhail Y. Fursov
*/
#ifndef _IA32_CODE_LAYOUT
#define _IA32_CODE_LAYOUT
#include "Ia32IRManager.h"
namespace Jitrino
{
namespace Ia32 {
class BasicBlock;
class Layouter : public SessionAction {
void runImpl();
U_32 getSideEffects() const {return 0;}
U_32 getNeedInfo()const{ return 0;}
};
/**
* Base class for code layout
*/
class Linearizer {
public:
enum LinearizerType { TOPOLOGICAL, TOPDOWN, BOTTOM_UP};
virtual ~Linearizer() {}
static void doLayout(LinearizerType t, IRManager* irManager);
static void checkLayout(IRManager* irm);
protected:
Linearizer(IRManager* irMgr);
void linearizeCfg();
virtual void linearizeCfgImpl() = 0;
/** Fix branches to work with the code layout */
void fixBranches();
/** Returns true if edge can be converted to a fall-through edge (i.e. an edge
* not requiring a branch) assuming the edge's head block is laid out after the tail block.
*/
bool canEdgeBeMadeToFallThrough(Edge *edge);
/** checks if CFG has no BB nodes without layout successors*/
bool isBlockLayoutDone();
// Fields
IRManager* irManager;
private:
/** Add block containing jump instruction to the fallthrough successor
* after this block
*/
BasicBlock* addJumpBlock(Edge * jumpEdge);
/** Reverse branch predicate. We assume that branch is the last instruction
* in the node.
*/
bool reverseBranchIfPossible(Node * bb);
};
/**
* Reverse post-order (topological) code layout
*/
class TopologicalLayout : public Linearizer {
friend class Linearizer;
protected:
TopologicalLayout(IRManager* irManager) : Linearizer(irManager){};
virtual ~TopologicalLayout() {}
void linearizeCfgImpl();
};
}} //namespace
#endif