diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index 48624a07d7c..714bc9db903 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -1344,10 +1344,9 @@ void NewGVN::valueNumberMemoryPhi(MemoryPhi *MP) { // congruence finding, and updating mappings. void NewGVN::valueNumberInstruction(Instruction *I) { DEBUG(dbgs() << "Processing instruction " << *I << "\n"); - if (I->use_empty() && !I->getType()->isVoidTy()) { + if (isInstructionTriviallyDead(I, TLI)) { DEBUG(dbgs() << "Skipping unused instruction\n"); - if (isInstructionTriviallyDead(I, TLI)) - markInstructionForDeletion(I); + markInstructionForDeletion(I); return; } if (!I->isTerminator()) { diff --git a/test/Transforms/NewGVN/pr31472.ll b/test/Transforms/NewGVN/pr31472.ll new file mode 100644 index 00000000000..db3ed29453c --- /dev/null +++ b/test/Transforms/NewGVN/pr31472.ll @@ -0,0 +1,34 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -basicaa -newgvn -S | FileCheck %s +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.12.0" + +;; Ensure the invoke does not accidentally get deleted as unused, just because the value is not used. + +; Function Attrs: norecurse ssp uwtable +define i32 @main() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*){ +; CHECK-LABEL: @main( +; CHECK-NEXT: [[TMP1:%.*]] = invoke i32 @foo() +; CHECK-NEXT: to label %good unwind label %bad +; CHECK: good: +; CHECK-NEXT: ret i32 5 +; CHECK: bad: +; CHECK-NEXT: [[TMP2:%.*]] = landingpad { i8*, i32 +; + %1 = invoke i32 @foo() + to label %good unwind label %bad + +good: +;