blob: 636750dcfba239f17d84f8c3af7599c610ad8a61 [file] [log] [blame]
Tom Stellard28d13a42015-05-12 17:13:02 +00001//===-- SIFixControlFlowLiveIntervals.cpp - Fix CF live intervals ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief Spilling of EXEC masks used for control flow messes up control flow
12/// lowering, so mark all live intervals associated with CF instructions as
13/// non-spillable.
14///
15//===----------------------------------------------------------------------===//
16
17#include "AMDGPU.h"
18#include "SIInstrInfo.h"
Tom Stellard28d13a42015-05-12 17:13:02 +000019#include "llvm/CodeGen/LiveIntervalAnalysis.h"
20#include "llvm/CodeGen/MachineFunctionPass.h"
Tom Stellard28d13a42015-05-12 17:13:02 +000021#include "llvm/CodeGen/MachineRegisterInfo.h"
Tom Stellard28d13a42015-05-12 17:13:02 +000022
23using namespace llvm;
24
25#define DEBUG_TYPE "si-fix-cf-live-intervals"
26
27namespace {
28
29class SIFixControlFlowLiveIntervals : public MachineFunctionPass {
30public:
31 static char ID;
32
33public:
34 SIFixControlFlowLiveIntervals() : MachineFunctionPass(ID) {
35 initializeSIFixControlFlowLiveIntervalsPass(*PassRegistry::getPassRegistry());
36 }
37
38 bool runOnMachineFunction(MachineFunction &MF) override;
39
40 const char *getPassName() const override {
41 return "SI Fix CF Live Intervals";
42 }
43
44 void getAnalysisUsage(AnalysisUsage &AU) const override {
45 AU.addRequired<LiveIntervals>();
46 AU.setPreservesAll();
47 MachineFunctionPass::getAnalysisUsage(AU);
48 }
49};
50
51} // End anonymous namespace.
52
53INITIALIZE_PASS_BEGIN(SIFixControlFlowLiveIntervals, DEBUG_TYPE,
54 "SI Fix CF Live Intervals", false, false)
55INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
56INITIALIZE_PASS_END(SIFixControlFlowLiveIntervals, DEBUG_TYPE,
57 "SI Fix CF Live Intervals", false, false)
58
59char SIFixControlFlowLiveIntervals::ID = 0;
60
61char &llvm::SIFixControlFlowLiveIntervalsID = SIFixControlFlowLiveIntervals::ID;
62
63FunctionPass *llvm::createSIFixControlFlowLiveIntervalsPass() {
64 return new SIFixControlFlowLiveIntervals();
65}
66
67bool SIFixControlFlowLiveIntervals::runOnMachineFunction(MachineFunction &MF) {
68 LiveIntervals *LIS = &getAnalysis<LiveIntervals>();
69
70 for (const MachineBasicBlock &MBB : MF) {
71 for (const MachineInstr &MI : MBB) {
72 switch (MI.getOpcode()) {
73 case AMDGPU::SI_IF:
74 case AMDGPU::SI_ELSE:
Matt Arsenault48d70cb2016-07-09 17:18:39 +000075 case AMDGPU::SI_BREAK:
Tom Stellard28d13a42015-05-12 17:13:02 +000076 case AMDGPU::SI_IF_BREAK:
77 case AMDGPU::SI_ELSE_BREAK:
78 case AMDGPU::SI_END_CF: {
79 unsigned Reg = MI.getOperand(0).getReg();
80 LIS->getInterval(Reg).markNotSpillable();
81 break;
82 }
83 default:
84 break;
85 }
86 }
87 }
88
89 return false;
90}