From 790eb1c4901a7bd2e1d71f12ea0ad92167f3461b Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 29 Apr 2016 06:17:47 +0000 Subject: [PATCH] DivergenceAnalysis: Fix crash with unreachable blocks Unreachable blocks may not be in the dominator tree, so don't crash on them. llvm-svn: 268001 --- llvm/lib/Analysis/DivergenceAnalysis.cpp | 5 +++++ .../AMDGPU/unreachable-loop-block.ll | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll diff --git a/llvm/lib/Analysis/DivergenceAnalysis.cpp b/llvm/lib/Analysis/DivergenceAnalysis.cpp index b30539f3b31e..d38725ff0acc 100644 --- a/llvm/lib/Analysis/DivergenceAnalysis.cpp +++ b/llvm/lib/Analysis/DivergenceAnalysis.cpp @@ -138,6 +138,11 @@ void DivergencePropagator::exploreSyncDependency(TerminatorInst *TI) { // a2 = 2; // a = phi(a1, a2); // sync dependent on (tid < 5) BasicBlock *ThisBB = TI->getParent(); + + // Unreachable blocks may not be in the dominator tree. + if (!DT.isReachableFromEntry(ThisBB)) + return; + BasicBlock *IPostDom = PDT.getNode(ThisBB)->getIDom()->getBlock(); if (IPostDom == nullptr) return; diff --git a/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll b/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll new file mode 100644 index 000000000000..ca93dda2c573 --- /dev/null +++ b/llvm/test/Analysis/DivergenceAnalysis/AMDGPU/unreachable-loop-block.ll @@ -0,0 +1,17 @@ +; RUN: opt %s -mtriple amdgcn-- -analyze -divergence | FileCheck %s + +; CHECK: DIVERGENT: %tmp = cmpxchg volatile +define void @unreachable_loop(i32 %tidx) #0 { +entry: + unreachable + +unreachable_loop: ; preds = %do.body.i, %if.then11 + %tmp = cmpxchg volatile i32 addrspace(1)* null, i32 0, i32 0 seq_cst seq_cst + %cmp.i = extractvalue { i32, i1 } %tmp, 1 + br i1 %cmp.i, label %unreachable_loop, label %end + +end: ; preds = %do.body.i51, %atomicAdd_g_f.exit + unreachable +} + +attributes #0 = { norecurse nounwind }