1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===- Interval.cpp - Interval class code ---------------------------------===// 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// The LLVM Compiler Infrastructure 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file is distributed under the University of Illinois Open Source 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// License. See LICENSE.TXT for details. 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file contains the definition of the Interval class, which represents a 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// partition of a control flow graph of some kind. 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Analysis/Interval.h" 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/BasicBlock.h" 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Support/CFG.h" 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Support/raw_ostream.h" 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <algorithm> 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousing namespace llvm; 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// Interval Implementation 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// isLoop - Find out if there is a back edge in this interval... 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaobool Interval::isLoop() const { 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // There is a loop in this interval iff one of the predecessors of the header 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // node lives in the interval. 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (::pred_iterator I = ::pred_begin(HeaderNode), E = ::pred_end(HeaderNode); 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao I != E; ++I) 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (contains(*I)) 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return true; 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return false; 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid Interval::print(raw_ostream &OS) const { 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << "-------------------------------------------------------------\n" 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao << "Interval Contents:\n"; 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Print out all of the basic blocks in the interval... 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (std::vector<BasicBlock*>::const_iterator I = Nodes.begin(), 46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao E = Nodes.end(); I != E; ++I) 47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << **I << "\n"; 48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << "Interval Predecessors:\n"; 50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (std::vector<BasicBlock*>::const_iterator I = Predecessors.begin(), 51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao E = Predecessors.end(); I != E; ++I) 52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << **I << "\n"; 53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << "Interval Successors:\n"; 55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (std::vector<BasicBlock*>::const_iterator I = Successors.begin(), 56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao E = Successors.end(); I != E; ++I) 57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao OS << **I << "\n"; 58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 59