Index: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp @@ -2026,6 +2026,24 @@ continue; } + // LLVM's definition of dominance allows instructions that are cyclic + // in unreachable blocks, e.g.: + // %pat = select i1 %condition, @global, i16* %pat + // because any instruction dominates an instruction in a block that's + // not reachable from entry. + // So, remove unreachable blocks from the function, because a) there's + // no point in analyzing them and b) GlobalOpt should otherwise grow + // some more complicated logic to break these cycles. + // Removing unreachable blocks might invalidate the dominator so we + // recalculate it. + if (!F->isDeclaration()) { + if (removeUnreachableBlocks(*F)) { + auto &DT = LookupDomTree(*F); + DT.recalculate(*F); + Changed = true; + } + } + Changed |= processGlobal(*F, TLI, LookupDomTree); if (!F->hasLocalLinkage()) Index: llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll =================================================================== --- llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll +++ llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll @@ -0,0 +1,17 @@ +; RUN: opt -S -globalopt %s | FileCheck %s + +; CHECK-LABEL: define void @beth +; CHECK-NEXT: entry: +; CHECK-NEXT: ret void +; CHEC-NEXT: } + +@glob = external global i16, align 1 + +define void @beth() { +entry: + ret void + +notreachable: + %patatino = select i1 undef, i16* @glob, i16* %patatino + br label %notreachable +}