Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Sep 2019 16:06:38 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r351938 - head/contrib/llvm/lib/CodeGen
Message-ID:  <201909061606.x86G6c3a038182@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Fri Sep  6 16:06:37 2019
New Revision: 351938
URL: https://svnweb.freebsd.org/changeset/base/351938

Log:
  Pull in r371111 from upstream llvm trunk (by Eli Friedman):
  
    [IfConversion] Fix diamond conversion with unanalyzable branches.
  
    The code was incorrectly counting the number of identical
    instructions, and therefore tried to predicate an instruction which
    should not have been predicated.  This could have various effects: a
    compiler crash, an assembler failure, a miscompile, or just
    generating an extra, unnecessary instruction.
  
    Instead of depending on TargetInstrInfo::removeBranch, which only
    works on analyzable branches, just remove all branch instructions.
  
    Fixes https://bugs.llvm.org/show_bug.cgi?id=43121 and
    https://bugs.llvm.org/show_bug.cgi?id=41121 .
  
    Differential Revision: https://reviews.llvm.org/D67203
  
  This should fix "Unable to predicate BX killed renamable $r0" errors
  when building the lang/spidermonkey170 and lang/spidermonkey38 ports for
  armv7 and armv6.
  
  PR:		236567
  MFC after:	3 days

Modified:
  head/contrib/llvm/lib/CodeGen/IfConversion.cpp

Modified: head/contrib/llvm/lib/CodeGen/IfConversion.cpp
==============================================================================
--- head/contrib/llvm/lib/CodeGen/IfConversion.cpp	Fri Sep  6 15:43:53 2019	(r351937)
+++ head/contrib/llvm/lib/CodeGen/IfConversion.cpp	Fri Sep  6 16:06:37 2019	(r351938)
@@ -1759,9 +1759,15 @@ bool IfConverter::IfConvertDiamondCommon(
   if (!BBI1->IsBrAnalyzable)
     verifySameBranchInstructions(&MBB1, &MBB2);
 #endif
-  BBI1->NonPredSize -= TII->removeBranch(*BBI1->BB);
-  // Remove duplicated instructions.
+  // Remove duplicated instructions from the tail of MBB1: any branch
+  // instructions, and the common instructions counted by NumDups2.
   DI1 = MBB1.end();
+  while (DI1 != MBB1.begin()) {
+    MachineBasicBlock::iterator Prev = std::prev(DI1);
+    if (!Prev->isBranch() && !Prev->isDebugInstr())
+      break;
+    DI1 = Prev;
+  }
   for (unsigned i = 0; i != NumDups2; ) {
     // NumDups2 only counted non-dbg_value instructions, so this won't
     // run off the head of the list.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909061606.x86G6c3a038182>