diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -439,6 +439,9 @@ return true; } + if (isAllocationFn(I, TLI) && isAllocRemovable(cast(I), TLI)) + return true; + if (!I->willReturn()) return false; @@ -489,9 +492,6 @@ } } - if (isAllocationFn(I, TLI) && isAllocRemovable(cast(I), TLI)) - return true; - if (CallInst *CI = isFreeCall(I, TLI)) if (Constant *C = dyn_cast(CI->getArgOperand(0))) return C->isNullValue() || isa(C); diff --git a/llvm/test/Transforms/CodeGenPrepare/dead-allocation.ll b/llvm/test/Transforms/CodeGenPrepare/dead-allocation.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/CodeGenPrepare/dead-allocation.ll @@ -0,0 +1,23 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; Eliminate the dead allocation instruction +; RUN: opt -codegenprepare < %s -S | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "armv7--linux-gnueabihf" + +@.str = private unnamed_addr constant [2 x i8] c"a\00", align 1 + +define void @func() { +; CHECK-LABEL: @func( +; CHECK-NEXT: entry: +; CHECK-NEXT: ret void +; +entry: + %0 = tail call noalias noundef nonnull dereferenceable(32) ptr @_Znwm(i64 noundef 32) + %1 = icmp ugt ptr %0, @.str + tail call void @llvm.assume(i1 %1) + ret void +} + +declare noundef nonnull ptr @_Znwm(i64 noundef) local_unnamed_addr +declare void @llvm.assume(i1 noundef)