Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Nov 2014 00:33:31 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r275160 - projects/clang350-import/contrib/llvm/lib/Transforms/InstCombine
Message-ID:  <201411270033.sAR0XVNu068629@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Thu Nov 27 00:33:31 2014
New Revision: 275160
URL: https://svnweb.freebsd.org/changeset/base/275160

Log:
  Pull in r222856 from upstream llvm trunk (by David Majnemer):
  
    Revert "Added inst combine transforms for single bit tests from Chris's note"
  
    This reverts commit r210006, it miscompiled libapr which is used in who
    knows how many projects.
  
    A test has been added to ensure that we don't regress again.
  
  This fixes a miscompilation in libapr, which caused problems in svnlite.

Modified:
  projects/clang350-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Modified: projects/clang350-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
==============================================================================
--- projects/clang350-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp	Thu Nov 27 00:27:39 2014	(r275159)
+++ projects/clang350-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp	Thu Nov 27 00:33:31 2014	(r275160)
@@ -387,15 +387,7 @@ static Value *SimplifyWithOpReplaced(Val
 /// 1. The icmp predicate is inverted
 /// 2. The select operands are reversed
 /// 3. The magnitude of C2 and C1 are flipped
-///
-/// This also tries to turn
-/// --- Single bit tests:
-/// if ((x & C) == 0) x |= C	to  x |= C
-/// if ((x & C) != 0) x ^= C	to  x &= ~C
-/// if ((x & C) == 0) x ^= C	to  x |= C
-/// if ((x & C) != 0) x &= ~C	to  x &= ~C
-/// if ((x & C) == 0) x &= ~C	to  nothing
-static Value *foldSelectICmpAndOr(SelectInst &SI, Value *TrueVal,
+static Value *foldSelectICmpAndOr(const SelectInst &SI, Value *TrueVal,
                                   Value *FalseVal,
                                   InstCombiner::BuilderTy *Builder) {
   const ICmpInst *IC = dyn_cast<ICmpInst>(SI.getCondition());
@@ -414,25 +406,6 @@ static Value *foldSelectICmpAndOr(Select
     return nullptr;
 
   const APInt *C2;
-  if (match(TrueVal, m_Specific(X))) {
-    // if ((X & C) != 0) X ^= C becomes X &= ~C
-    if (match(FalseVal, m_Xor(m_Specific(X), m_APInt(C2))) && C1 == C2)
-      return Builder->CreateAnd(X, ~(*C1));
-    // if ((X & C) != 0) X &= ~C becomes X &= ~C
-    if (match(FalseVal, m_And(m_Specific(X), m_APInt(C2))) && *C1 == ~(*C2))
-      return FalseVal;
-  } else if (match(FalseVal, m_Specific(X))) {
-    // if ((X & C) == 0) X ^= C becomes X |= C
-    if (match(TrueVal, m_Xor(m_Specific(X), m_APInt(C2))) && C1 == C2)
-      return Builder->CreateOr(X, *C1);
-    // if ((X & C) == 0) X &= ~C becomes nothing
-    if (match(TrueVal, m_And(m_Specific(X), m_APInt(C2))) && *C1 == ~(*C2))
-      return X;
-    // if ((X & C) == 0) X |= C becomes X |= C
-    if (match(TrueVal, m_Or(m_Specific(X), m_APInt(C2))) && C1 == C2)
-      return TrueVal;
-  }
-
   bool OrOnTrueVal = false;
   bool OrOnFalseVal = match(FalseVal, m_Or(m_Specific(TrueVal), m_Power2(C2)));
   if (!OrOnFalseVal)



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