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