1cf3056db0fee1db7921214b1f25cea04e959e105Chris Lattner//===- Interval.cpp - Interval class code ---------------------------------===// 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 92275c1d55d48a48d23089e8ce18bab275eaebac8Chris Lattner// 101b7f7dc4b45a900fae2e9b062d588a995935727aChris Lattner// This file contains the definition of the Interval class, which represents a 111b7f7dc4b45a900fae2e9b062d588a995935727aChris Lattner// partition of a control flow graph of some kind. 122275c1d55d48a48d23089e8ce18bab275eaebac8Chris Lattner// 132275c1d55d48a48d23089e8ce18bab275eaebac8Chris Lattner//===----------------------------------------------------------------------===// 142275c1d55d48a48d23089e8ce18bab275eaebac8Chris Lattner 15107109c2cda7937d7169e3096f5dfc25daddf984Chris Lattner#include "llvm/Analysis/Interval.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CFG.h" 18bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner#include "llvm/Support/raw_ostream.h" 19a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner#include <algorithm> 202275c1d55d48a48d23089e8ce18bab275eaebac8Chris Lattner 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 231c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner//===----------------------------------------------------------------------===// 241c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner// Interval Implementation 251c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner//===----------------------------------------------------------------------===// 261c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner 271c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner// isLoop - Find out if there is a back edge in this interval... 281c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner// 291b7f7dc4b45a900fae2e9b062d588a995935727aChris Lattnerbool Interval::isLoop() const { 3094c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // There is a loop in this interval iff one of the predecessors of the header 311c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner // node lives in the interval. 32455889aa79e3463a4b0f2161e3d9d72a683268b6Chris Lattner for (::pred_iterator I = ::pred_begin(HeaderNode), E = ::pred_end(HeaderNode); 33bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner I != E; ++I) 34bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner if (contains(*I)) 35bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner return true; 361c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner return false; 371c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner} 381c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner 391c54f1da79a68b22cb093f5bfaed3f8bbdc2b966Chris Lattner 4045cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattnervoid Interval::print(raw_ostream &OS) const { 41bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << "-------------------------------------------------------------\n" 42a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner << "Interval Contents:\n"; 432b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 44a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner // Print out all of the basic blocks in the interval... 451ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner for (std::vector<BasicBlock*>::const_iterator I = Nodes.begin(), 461ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner E = Nodes.end(); I != E; ++I) 47bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << **I << "\n"; 48a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 49bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << "Interval Predecessors:\n"; 501ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner for (std::vector<BasicBlock*>::const_iterator I = Predecessors.begin(), 511ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner E = Predecessors.end(); I != E; ++I) 52bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << **I << "\n"; 531ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner 54bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << "Interval Successors:\n"; 551ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner for (std::vector<BasicBlock*>::const_iterator I = Successors.begin(), 561ff1ff70e3eef938b1290f3e3b386bb0feca2c5aChris Lattner E = Successors.end(); I != E; ++I) 57bdff548e4dd577a72094d57b282de4e765643b96Chris Lattner OS << **I << "\n"; 58a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner} 59