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