<div dir="ltr">This revision broke our bots: <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/3010/steps/check-llvm%20asan/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/3010/steps/check-llvm%20asan/logs/stdio</a><div><br></div><div>Please address.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 13, 2017 at 3:47 AM, Simon Dardis via Phabricator via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This revision was automatically updated to reflect the committed changes.<br>
Closed by commit rL318032: [CodeGenPrepare] Check that erased sunken address are not reused (authored by sdardis).<br>
<span class=""><br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="https://reviews.llvm.org/D39841" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D39841</a><br>
<br>
Files:<br>
</span>  llvm/trunk/lib/CodeGen/<wbr>CodeGenPrepare.cpp<br>
  llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/lit.local.<wbr>cfg<br>
  llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/pr35209.ll<br>
<br>
<br>
Index: llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/pr35209.ll<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/pr35209.ll<br>
+++ llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/pr35209.ll<br>
@@ -0,0 +1,64 @@<br>
+; RUN: opt -S -mtriple=mips64-mti-linux-gnu -codegenprepare < %s | FileCheck %s<br>
<span class="">+<br>
+; Test that if an address that was sunk from a dominating bb, used in a<br>
+; select that is erased along with its' trivally dead operand, that the<br>
+; sunken address is not reused if the same address computation occurs<br>
+; after the select. Previously, this caused a ICE.<br>
+<br>
+%<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a> = type { i32, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>* }<br>
+%<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a> = type { i32 }<br>
+%struct.f = type { %<a href="http://struct.ax" rel="noreferrer" target="_blank">struct.ax</a>, %union.anon }<br>
+%<a href="http://struct.ax" rel="noreferrer" target="_blank">struct.ax</a> = type { %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>* }<br>
+%union.anon = type { %<a href="http://struct.bd" rel="noreferrer" target="_blank">struct.bd</a> }<br>
+%<a href="http://struct.bd" rel="noreferrer" target="_blank">struct.bd</a> = type { i64 }<br>
+%<a href="http://struct.bg" rel="noreferrer" target="_blank">struct.bg</a> = type { i32, i32 }<br>
+%struct.ap = type { i32, i32 }<br>
+<br>
+@ch = common global %struct.f zeroinitializer, align 8<br>
</span>+@j = common global %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>* null, align 8<br>
+@ck = common global i32 0, align 4<br>
+@h = common global i32 0, align 4<br>
<span class="">+@.str = private unnamed_addr constant [1 x i8] zeroinitializer, align 1<br>
+<br>
+define internal void @probestart() {<br>
+entry:<br>
+  %0 = load %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>*, %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>** @j, align 8<br>
+  %bw = getelementptr inbounds %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>, %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>* %0, i64 0, i32 1<br>
+  %1 = load i32, i32* @h, align 4<br>
+  %cond = icmp eq i32 %1, 0<br>
+  br i1 %cond, label %<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a>, label %cl<br>
+<br>
+<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a>:                                            ; preds = %entry<br>
+  %call = tail call inreg { i64, i64 } @ba(i32* bitcast (%struct.f* @ch to i32*))<br>
</span><span class="">+  br label %cl<br>
+<br>
+cl:                                               ; preds = %<a href="http://sw.bb" rel="noreferrer" target="_blank">sw.bb</a>, %entry<br>
+  %2 = load %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>*, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>** %bw, align 8<br>
+  %tobool = icmp eq %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>* %2, null<br>
+  %3 = load i32, i32* @ck, align 4<br>
+  %.sink5 = select i1 %tobool, i32* getelementptr (%<a href="http://struct.bg" rel="noreferrer" target="_blank">struct.bg</a>, %<a href="http://struct.bg" rel="noreferrer" target="_blank">struct.bg</a>* bitcast (%union.anon* getelementptr inbounds (%struct.f, %struct.f* @ch, i64 0, i32 1) to %<a href="http://struct.bg" rel="noreferrer" target="_blank">struct.bg</a>*), i64 0, i32 1), i32* getelementptr (%struct.ap, %struct.ap* bitcast (%union.anon* getelementptr inbounds (%struct.f, %struct.f* @ch, i64 0, i32 1) to %struct.ap*), i64 0, i32 1)<br>
+  store i32 %3, i32* %.sink5, align 4<br>
+  store i32 1, i32* bitcast (i64* getelementptr inbounds (%struct.f, %struct.f* @ch, i64 0, i32 1, i32 0, i32 0) to i32*), align 8<br>
+  %4 = load %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>*, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>** %bw, align 8<br>
+  tail call void (i8*, ...) @a(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>* %4)<br>
</span><span class="">+  ret void<br>
+}<br>
+<br>
</span><span class="">+; CHECK-LABEL: @probestart()<br>
+; CHECK-LABEL: entry:<br>
+; CHECK: %[[I0:[0-9]+]] = load %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>*, %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>** @j<br>
+; CHECK-LABEL: cl:<br>
+<br>
+; CHECK-NOT: %{{[0-9]+}}  = load %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>*, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>** %bw<br>
+; CHECK-NOT: %{{[.a-z0-9]}} = select<br>
+; CHECK-NOT: %{{[0-9]+}}  = load %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>*, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>** %bw<br>
+<br>
+; CHECK: %[[I1:[0-9]+]] = bitcast %<a href="http://struct.az" rel="noreferrer" target="_blank">struct.az</a>* %[[I0]] to i8*<br>
+; CHECK-NEXT: %sunkaddr = getelementptr i8, i8* %[[I1]], i64 8<br>
+; CHECK-NEXT: %[[I2:[0-9]+]] = bitcast i8* %sunkaddr to %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>**<br>
+; CHECK-NEXT: %{{[0-9]+}} = load %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>*, %<a href="http://struct.bt" rel="noreferrer" target="_blank">struct.bt</a>** %[[I2]]<br>
</span>+; CHECK-NEXT: tail call void (i8*, ...) @a<br>
<span class="">+<br>
+declare inreg { i64, i64 } @ba(i32*)<br>
</span><span class="">+<br>
+declare void @a(i8*, ...)<br>
</span>Index: llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/lit.local.<wbr>cfg<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/lit.local.<wbr>cfg<br>
+++ llvm/trunk/test/Transforms/<wbr>CodeGenPrepare/Mips/lit.local.<wbr>cfg<br>
<span class="">@@ -0,0 +1,2 @@<br>
+if not 'Mips' in config.root.targets:<br>
+    config.unsupported = True<br>
</span>Index: llvm/trunk/lib/CodeGen/<wbr>CodeGenPrepare.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/lib/CodeGen/<wbr>CodeGenPrepare.cpp<br>
+++ llvm/trunk/lib/CodeGen/<wbr>CodeGenPrepare.cpp<br>
<div class="HOEnZb"><div class="h5">@@ -4358,7 +4358,12 @@<br>
   // Now that we determined the addressing expression we want to use and know<br>
   // that we have to sink it into this block.  Check to see if we have already<br>
   // done this for some other load/store instr in this block.  If so, reuse the<br>
-  // computation.<br>
+  // computation.  Before attempting reuse, check if the address is valid as it<br>
+  // may have been erased.<br>
+  auto I = SunkAddrs.find(Addr);<br>
+  if (I != SunkAddrs.end() && I->second && I->second->user_empty())<br>
+    SunkAddrs.erase(I);<br>
+<br>
   Value *&SunkAddr = SunkAddrs[Addr];<br>
   if (SunkAddr) {<br>
     DEBUG(dbgs() << "CGP: Reusing nonlocal addrmode: " << AddrMode << " for "<br>
<br>
<br>
</div></div><br>______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>