[llvm] 7547508 - Revert "[StackSafety] Skip ambiguous lifetime analysis"
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 16 18:07:03 PDT 2020
Thanks, I've reduced it further and included it into the patch.
On Fri, 7 Aug 2020 at 18:34, Alexander Kornienko <alexfh at google.com> wrote:
> In case you need an isolated test case for a regression test, I happen to
> have one:
>
> template <class> struct a;
> template <class u> struct a<u &> { typedef u e; };
> template <class u> typename a<u>::e &&f(u &&g) {
> return static_cast<typename a<u>::e>(g);
> }
> typedef char h;
> template <typename i> class j {
> i k;
>
> public:
> bool l();
> void operator=(i g) {
> if (l())
> k = f(g);
> }
> };
> template <typename i> class m {
> j<i> n;
>
> public:
> void operator=(i g) { n = g; }
> };
> class o {
> char *p;
> int x;
> };
> class F {
> o p;
> h q;
>
> public:
> void r();
> };
> struct s {
> void t(F);
> struct H {
> h b, c, d;
> };
> m<H> z;
> };
> void s::t(F g) {
> g.r();
> z = H();
> }
>
>
> $ clang -cc1 -triple x86_64-grtev4-linux-gnu -emit-obj -O3
> -fsanitize=safe-stack -o qqq.o -x c++ qqq.cc
> ...
> PLEASE submit a bug report to http://go/clang-crash-bug and include the
> crash backtrace, preprocessed source, and associated run script.
> Stack dump:
> 0. Program arguments: clang -cc1 -triple x86_64-grtev4-linux-gnu
> -emit-obj -O3 -fsanitize=safe-stack -o qqq.o -x c++ qqq.cc
> 1. <eof> parser at end of file
> 2. Code generation
> 3. Running pass 'Function Pass Manager' on module 'qqq.cc'.
> 4. Running pass 'Safe Stack instrumentation pass' on function
> '@_ZN1s1tE1F'
> #0 0x000055ae224be7e2 SignalHandler(int)
> #1 0x00007f0d4a6ea9a0 __restore_rt
> #2 0x000055ae22390d64 llvm::StackLifetime::collectMarkers()
> #3 0x000055ae21fdc4ff (anonymous namespace)::SafeStack::run()
> #4 0x000055ae208396fe (anonymous
> namespace)::SafeStackLegacyPass::runOnFunction(llvm::Function&)
> (.llvm.1747005879505724891)
> #5 0x000055ae202a17c0 llvm::FPPassManager::runOnFunction(llvm::Function&)
> #6 0x000055ae202a1154 llvm::FPPassManager::runOnModule(llvm::Module&)
> #7 0x000055ae1f37fb05 llvm::legacy::PassManagerImpl::run(llvm::Module&)
> ...
>
> On Fri, Aug 7, 2020 at 11:03 PM Vitaly Buka via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>>
>> Author: Vitaly Buka
>> Date: 2020-08-07T14:02:50-07:00
>> New Revision: 7547508b7ae0985bde2b2cbba953f87e5c30e242
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/7547508b7ae0985bde2b2cbba953f87e5c30e242
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/7547508b7ae0985bde2b2cbba953f87e5c30e242.diff
>>
>> LOG: Revert "[StackSafety] Skip ambiguous lifetime analysis"
>>
>> This reverts commit 0b2616a8045cb776ea1514c3401d0a8577de1060.
>>
>> Crashes with safe-stack.
>>
>> Added:
>>
>>
>> Modified:
>> llvm/include/llvm/Analysis/StackLifetime.h
>> llvm/lib/Analysis/StackLifetime.cpp
>> llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll
>> llvm/test/CodeGen/AArch64/stack-tagging.ll
>>
>> Removed:
>>
>>
>>
>>
>> ################################################################################
>> diff --git a/llvm/include/llvm/Analysis/StackLifetime.h
>> b/llvm/include/llvm/Analysis/StackLifetime.h
>> index 1c0e10368daf..8abc6cc1ce00 100644
>> --- a/llvm/include/llvm/Analysis/StackLifetime.h
>> +++ b/llvm/include/llvm/Analysis/StackLifetime.h
>> @@ -121,8 +121,6 @@ class StackLifetime {
>> DenseMap<const BasicBlock *, SmallVector<std::pair<unsigned, Marker>,
>> 4>>
>> BBMarkers;
>>
>> - bool HasUnknownLifetimeStartOrEnd = false;
>> -
>> void dumpAllocas() const;
>> void dumpBlockLiveness() const;
>> void dumpLiveRanges() const;
>>
>> diff --git a/llvm/lib/Analysis/StackLifetime.cpp
>> b/llvm/lib/Analysis/StackLifetime.cpp
>> index d953a8762608..9727b7a33d1f 100644
>> --- a/llvm/lib/Analysis/StackLifetime.cpp
>> +++ b/llvm/lib/Analysis/StackLifetime.cpp
>> @@ -11,7 +11,6 @@
>> #include "llvm/ADT/STLExtras.h"
>> #include "llvm/ADT/SmallVector.h"
>> #include "llvm/ADT/StringExtras.h"
>> -#include "llvm/Analysis/ValueTracking.h"
>> #include "llvm/Config/llvm-config.h"
>> #include "llvm/IR/AssemblyAnnotationWriter.h"
>> #include "llvm/IR/BasicBlock.h"
>> @@ -64,27 +63,42 @@ bool StackLifetime::isAliveAfter(const AllocaInst *AI,
>> return getLiveRange(AI).test(InstNum);
>> }
>>
>> +static bool readMarker(const Instruction *I, bool *IsStart) {
>> + if (!I->isLifetimeStartOrEnd())
>> + return false;
>> +
>> + auto *II = cast<IntrinsicInst>(I);
>> + *IsStart = II->getIntrinsicID() == Intrinsic::lifetime_start;
>> + return true;
>> +}
>> +
>> void StackLifetime::collectMarkers() {
>> InterestingAllocas.resize(NumAllocas);
>> DenseMap<const BasicBlock *, SmallDenseMap<const IntrinsicInst *,
>> Marker>>
>> BBMarkerSet;
>>
>> // Compute the set of start/end markers per basic block.
>> - for (const BasicBlock *BB : depth_first(&F)) {
>> - for (const Instruction &I : *BB) {
>> - const IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I);
>> - if (!II || !II->isLifetimeStartOrEnd())
>> - continue;
>> - const AllocaInst *AI =
>> llvm::findAllocaForValue(II->getArgOperand(1));
>> - if (!AI) {
>> - HasUnknownLifetimeStartOrEnd = true;
>> - continue;
>> + for (unsigned AllocaNo = 0; AllocaNo < NumAllocas; ++AllocaNo) {
>> + const AllocaInst *AI = Allocas[AllocaNo];
>> + SmallVector<const Instruction *, 8> WorkList;
>> + WorkList.push_back(AI);
>> + while (!WorkList.empty()) {
>> + const Instruction *I = WorkList.pop_back_val();
>> + for (const User *U : I->users()) {
>> + if (auto *BI = dyn_cast<BitCastInst>(U)) {
>> + WorkList.push_back(BI);
>> + continue;
>> + }
>> + auto *UI = dyn_cast<IntrinsicInst>(U);
>> + if (!UI)
>> + continue;
>> + bool IsStart;
>> + if (!readMarker(UI, &IsStart))
>> + continue;
>> + if (IsStart)
>> + InterestingAllocas.set(AllocaNo);
>> + BBMarkerSet[UI->getParent()][UI] = {AllocaNo, IsStart};
>> }
>> - bool IsStart = II->getIntrinsicID() == Intrinsic::lifetime_start;
>> - unsigned AllocaNo = AllocaNumbering[AI];
>> - if (IsStart)
>> - InterestingAllocas.set(AllocaNo);
>> - BBMarkerSet[BB][II] = {AllocaNo, IsStart};
>> }
>> }
>>
>> @@ -290,20 +304,6 @@ StackLifetime::StackLifetime(const Function &F,
>> }
>>
>> void StackLifetime::run() {
>> - if (HasUnknownLifetimeStartOrEnd) {
>> - // There is marker which we can't assign to a specific alloca, so we
>> - // fallback to the most conservative results for the type.
>> - switch (Type) {
>> - case LivenessType::May:
>> - LiveRanges.resize(NumAllocas, getFullLiveRange());
>> - break;
>> - case LivenessType::Must:
>> - LiveRanges.resize(NumAllocas, LiveRange(Instructions.size()));
>> - break;
>> - }
>> - return;
>> - }
>> -
>> LiveRanges.resize(NumAllocas, LiveRange(Instructions.size()));
>> for (unsigned I = 0; I < NumAllocas; ++I)
>> if (!InterestingAllocas.test(I))
>>
>> diff --git a/llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll
>> b/llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll
>> index 470450a3a977..1c7eeb5ac69c 100644
>> --- a/llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll
>> +++ b/llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll
>> @@ -742,7 +742,7 @@ if.end:
>> ; MAY-NEXT: Alive: <x y>
>> ; MUST-NEXT: Alive: <y>
>>
>> - ret void
>> +ret void
>> }
>>
>> define void @unreachable() {
>> @@ -778,62 +778,7 @@ end:
>> ; CHECK: end:
>> ; CHECK-NEXT: Alive: <x y>
>>
>> - ret void
>> -}
>> -
>> -define void @non_alloca(i8* %p) {
>> -; CHECK-LABEL: define void @non_alloca
>> -entry:
>> -; CHECK: entry:
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> - %x = alloca i8, align 4
>> - %y = alloca i8, align 4
>> -
>> - call void @llvm.lifetime.start.p0i8(i64 4, i8* %p)
>> -; CHECK: call void @llvm.lifetime.start.p0i8(i64 4, i8* %p)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - call void @llvm.lifetime.start.p0i8(i64 4, i8* %x)
>> -; CHECK: call void @llvm.lifetime.start.p0i8(i64 4, i8* %x)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - call void @llvm.lifetime.end.p0i8(i64 4, i8* %p)
>> -; CHECK: call void @llvm.lifetime.end.p0i8(i64 4, i8* %p)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - ret void
>> -}
>> -
>> -define void @select_alloca(i1 %v) {
>> -; CHECK-LABEL: define void @select_alloca
>> -entry:
>> -; CHECK: entry:
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> - %x = alloca i8, align 4
>> - %y = alloca i8, align 4
>> - %cxcy = select i1 %v, i8* %x, i8* %y
>> -
>> - call void @llvm.lifetime.start.p0i8(i64 1, i8* %cxcy)
>> -; CHECK: call void @llvm.lifetime.start.p0i8(i64 1, i8* %cxcy)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
>> -; CHECK: call void @llvm.lifetime.start.p0i8(i64 1, i8* %x)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
>> -; CHECK: call void @llvm.lifetime.end.p0i8(i64 1, i8* %x)
>> -; MAY-NEXT: Alive: <x y>
>> -; MUST-NEXT: Alive: <>
>> -
>> - ret void
>> +ret void
>> }
>>
>> declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
>>
>> diff --git a/llvm/test/CodeGen/AArch64/stack-tagging.ll
>> b/llvm/test/CodeGen/AArch64/stack-tagging.ll
>> index 83fe4025ea0c..275b8a7dbad7 100644
>> --- a/llvm/test/CodeGen/AArch64/stack-tagging.ll
>> +++ b/llvm/test/CodeGen/AArch64/stack-tagging.ll
>> @@ -192,9 +192,10 @@ another_bb:
>> ; CHECK: alloca { i32, [12 x i8] }, align 16
>> ; CHECK: call { i32, [12 x i8] }* @llvm.aarch64.tagp
>> ; CHECK: call void @llvm.aarch64.settag(
>> -; CHECK: alloca { i32, [12 x i8] }, align 16
>> -; CHECK: call { i32, [12 x i8] }* @llvm.aarch64.tagp
>> -; CHECK: call void @llvm.aarch64.settag(
>> +; SSI: alloca i32, align 4
>> +; NOSSI: alloca { i32, [12 x i8] }, align 16
>> +; NOSSI: call { i32, [12 x i8] }* @llvm.aarch64.tagp
>> +; NOSSI: call void @llvm.aarch64.settag(
>> ; CHECK: store i32
>> ; CHECK: call void @noUse32(i32*
>> ; CHECK: store i32
>> @@ -202,7 +203,7 @@ another_bb:
>> ; CHECK: call void @noUse32(i32*
>> ; CHECK: call void @llvm.aarch64.settag(
>> ; CHECK: call void @llvm.aarch64.settag(
>> -; CHECK: call void @llvm.aarch64.settag(
>> +; NOSSI: call void @llvm.aarch64.settag(
>> ; CHECK: ret void
>>
>> -!0 = !{}
>> +!0 = !{}
>> \ No newline at end of file
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200816/b2eec402/attachment.html>
More information about the llvm-commits
mailing list