From abd820a92bc82b5279c8cf87d54e89915414fedb Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 23 Oct 2018 21:23:18 +0000 Subject: [PATCH] CGP: Clear data structures at the end of a loop iteration instead of the beginning. Clearing LargeOffsetGEPMap at the end fixes a bug where if a large offset GEP is in a dead basic block, we fail an assertion when trying to delete the block due to the asserting VH in LargeOffsetGEPMap. Differential Revision: https://reviews.llvm.org/D53464 llvm-svn: 345082 --- llvm/lib/CodeGen/CodeGenPrepare.cpp | 10 +++++----- .../CodeGen/Thumb2/unreachable-large-offset-gep.ll | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 llvm/test/CodeGen/Thumb2/unreachable-large-offset-gep.ll diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index fa5cc4d..6e73f7d 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -436,11 +436,6 @@ bool CodeGenPrepare::runOnFunction(Function &F) { bool MadeChange = true; while (MadeChange) { MadeChange = false; - SeenChainsForSExt.clear(); - ValToSExtendedUses.clear(); - RemovedInsts.clear(); - LargeOffsetGEPMap.clear(); - LargeOffsetGEPID.clear(); for (Function::iterator I = F.begin(); I != F.end(); ) { BasicBlock *BB = &*I++; bool ModifiedDTOnIteration = false; @@ -460,6 +455,11 @@ bool CodeGenPrepare::runOnFunction(Function &F) { I->deleteValue(); EverMadeChange |= MadeChange; + SeenChainsForSExt.clear(); + ValToSExtendedUses.clear(); + RemovedInsts.clear(); + LargeOffsetGEPMap.clear(); + LargeOffsetGEPID.clear(); } SunkAddrs.clear(); diff --git a/llvm/test/CodeGen/Thumb2/unreachable-large-offset-gep.ll b/llvm/test/CodeGen/Thumb2/unreachable-large-offset-gep.ll new file mode 100644 index 0000000..641787b --- /dev/null +++ b/llvm/test/CodeGen/Thumb2/unreachable-large-offset-gep.ll @@ -0,0 +1,22 @@ +; RUN: llc -o - %s | FileCheck %s + +; CHECK: .LBB0_1: +; CHECK: b .LBB0_1 + +target triple = "thumbv8m-unknown-linux-android" + +define void @d(i32* %c) { +entry: + br i1 false, label %f.exit, label %i.d + +i.d: + br label %i.d + +f.exit: + %0 = getelementptr i32, i32* %c, i32 57 + br label %if.g + +if.g: + store i32 0, i32* %0 + ret void +} -- 2.7.4