blob: 458c0a7de6c226a2dea883035c7af3b0800b77c6 [file] [log] [blame]
Xin Tong9d6f08a2017-06-06 02:34:41 +00001//===-- OrderedInstructions.cpp - Instruction dominance function ---------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Xin Tong9d6f08a2017-06-06 02:34:41 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines utility to check dominance relation of 2 instructions.
10//
11//===----------------------------------------------------------------------===//
12
Max Kazantsevd3a4cbe2018-08-30 04:49:03 +000013#include "llvm/Analysis/OrderedInstructions.h"
Xin Tong9d6f08a2017-06-06 02:34:41 +000014using namespace llvm;
15
Florian Hahn5ac26292018-06-20 17:42:01 +000016bool OrderedInstructions::localDominates(const Instruction *InstA,
17 const Instruction *InstB) const {
18 assert(InstA->getParent() == InstB->getParent() &&
19 "Instructions must be in the same basic block");
20
21 const BasicBlock *IBB = InstA->getParent();
22 auto OBB = OBBMap.find(IBB);
23 if (OBB == OBBMap.end())
24 OBB = OBBMap.insert({IBB, make_unique<OrderedBasicBlock>(IBB)}).first;
25 return OBB->second->dominates(InstA, InstB);
26}
27
Xin Tong9d6f08a2017-06-06 02:34:41 +000028/// Given 2 instructions, use OrderedBasicBlock to check for dominance relation
29/// if the instructions are in the same basic block, Otherwise, use dominator
30/// tree.
31bool OrderedInstructions::dominates(const Instruction *InstA,
32 const Instruction *InstB) const {
Xin Tong9d6f08a2017-06-06 02:34:41 +000033 // Use ordered basic block to do dominance check in case the 2 instructions
34 // are in the same basic block.
Florian Hahn5ac26292018-06-20 17:42:01 +000035 if (InstA->getParent() == InstB->getParent())
36 return localDominates(InstA, InstB);
Daniel Berlin7c757ae2017-06-29 17:01:03 +000037 return DT->dominates(InstA->getParent(), InstB->getParent());
Xin Tong9d6f08a2017-06-06 02:34:41 +000038}
Florian Hahn5ac26292018-06-20 17:42:01 +000039
40bool OrderedInstructions::dfsBefore(const Instruction *InstA,
41 const Instruction *InstB) const {
42 // Use ordered basic block in case the 2 instructions are in the same basic
43 // block.
44 if (InstA->getParent() == InstB->getParent())
45 return localDominates(InstA, InstB);
46
47 DomTreeNode *DA = DT->getNode(InstA->getParent());
48 DomTreeNode *DB = DT->getNode(InstB->getParent());
49 return DA->getDFSNumIn() < DB->getDFSNumIn();
50}