[PATCH] D19709: AMDGPU: Fix crash with unreachable terminators.
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 28 23:14:41 PDT 2016
arsenm created this revision.
arsenm added reviewers: tstellarAMD, nhaehnle.
arsenm added a subscriber: llvm-commits.
Herald added a subscriber: arsenm.
If a block has no successors because it ends in unreachable,
this was accessing an invalid iterator.
Also stop counting instructions that don't emit any
real instructions.
http://reviews.llvm.org/D19709
Files:
lib/Target/AMDGPU/SILowerControlFlow.cpp
Index: lib/Target/AMDGPU/SILowerControlFlow.cpp
===================================================================
--- lib/Target/AMDGPU/SILowerControlFlow.cpp
+++ lib/Target/AMDGPU/SILowerControlFlow.cpp
@@ -125,29 +125,44 @@
return new SILowerControlFlow();
}
+static bool opcodeEmitsNoInsts(unsigned Opc) {
+ switch (Opc) {
+ case TargetOpcode::IMPLICIT_DEF:
+ case TargetOpcode::KILL:
+ case TargetOpcode::BUNDLE:
+ case TargetOpcode::CFI_INSTRUCTION:
+ case TargetOpcode::EH_LABEL:
+ case TargetOpcode::GC_LABEL:
+ case TargetOpcode::DBG_VALUE:
+ return true;
+ default:
+ return false;
+ }
+}
+
bool SILowerControlFlow::shouldSkip(MachineBasicBlock *From,
MachineBasicBlock *To) {
unsigned NumInstr = 0;
+ MachineFunction *MF = From->getParent();
- for (MachineFunction::iterator MBBI = MachineFunction::iterator(From),
- ToI = MachineFunction::iterator(To); MBBI != ToI; ++MBBI) {
-
+ for (MachineFunction::iterator MBBI(From), ToI(To), End = MF->end();
+ MBBI != End && MBBI != ToI; ++MBBI) {
MachineBasicBlock &MBB = *MBBI;
for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
NumInstr < SkipThreshold && I != E; ++I) {
+ if (opcodeEmitsNoInsts(I->getOpcode()))
+ continue;
- if (I->isBundle() || !I->isBundled()) {
- // When a uniform loop is inside non-uniform control flow, the branch
- // leaving the loop might be an S_CBRANCH_VCCNZ, which is never taken
- // when EXEC = 0. We should skip the loop lest it becomes infinite.
- if (I->getOpcode() == AMDGPU::S_CBRANCH_VCCNZ)
- return true;
+ // When a uniform loop is inside non-uniform control flow, the branch
+ // leaving the loop might be an S_CBRANCH_VCCNZ, which is never taken
+ // when EXEC = 0. We should skip the loop lest it becomes infinite.
+ if (I->getOpcode() == AMDGPU::S_CBRANCH_VCCNZ)
+ return true;
- if (++NumInstr >= SkipThreshold)
- return true;
- }
+ if (++NumInstr >= SkipThreshold)
+ return true;
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19709.55532.patch
Type: text/x-patch
Size: 2160 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160429/ffd45deb/attachment.bin>
More information about the llvm-commits
mailing list