<div dir="ltr">msan is unhappy: <div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/5268/steps/build%20stage3%2Fmsan%20clang/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/5268/steps/build%20stage3%2Fmsan%20clang/logs/stdio</a><br></div><div>Can this be related? </div><div><br></div><div><pre style="font-family:'Courier New',courier,monotype,monospace;color:rgb(0,0,0);font-size:medium"><span class="">==6641== WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7f04d6c29d69 in simplifyUnsignedRangeCheck(llvm::ICmpInst*, llvm::ICmpInst*, bool) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Analysis/InstructionSimplify.cpp:1468:7
    #1 0x7f04d6c2b026 in SimplifyAndOfICmps(llvm::ICmpInst*, llvm::ICmpInst*) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Analysis/InstructionSimplify.cpp:1489:18
    #2 0x7f04d6bf2855 in SimplifyAndInst(llvm::Value*, llvm::Value*, (anonymous namespace)::Query const&, unsigned int) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Analysis/InstructionSimplify.cpp:1594:22
    #3 0x7f04d6c13520 in SimplifyAndInst /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Analysis/InstructionSimplify.cpp:1635:10
    #4 0x7f04d6c13520 in llvm::SimplifyInstruction(llvm::Instruction*, llvm::DataLayout const*, llvm::TargetLibraryInfo const*, llvm::DominatorTree const*, llvm::AssumptionTracker*) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Analysis/InstructionSimplify.cpp:3633
    #5 0x7f04d7e2c861 in processNode /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Transforms/Scalar/EarlyCSE.cpp:452:20
    #6 0x7f04d7e2c861 in (anonymous namespace)::EarlyCSE::runOnFunction(llvm::Function&) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Transforms/Scalar/EarlyCSE.cpp:620
    #7 0x7f04d77f0ccc in llvm::FPPassManager::runOnFunction(llvm::Function&) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/IR/LegacyPassManager.cpp:1541:23
    #8 0x7f04d77ef0df in llvm::legacy::FunctionPassManagerImpl::run(llvm::Function&) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/IR/LegacyPassManager.cpp:1490:16
    #9 0x7f04d90ca6e5 in EmitAssembly /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:601:9
    #10 0x7f04d90ca6e5 in clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:624
    #11 0x7f04d90a4a6e in clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:175:7
    #12 0x7f04da511082 in clang::ParseAST(clang::Sema&, bool, bool) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:154:3
    #13 0x7f04d8797035 in clang::FrontendAction::Execute() /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:428:8
    #14 0x7f04d8712d52 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:811:7
    #15 0x7f04d8963c6c in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222:18
    #16 0x7f04d53a1bbb in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/cc1_main.cpp:110:13
    #17 0x7f04d539c84b in ExecuteCC1Tool /mnt/b/sa</span><span class="">nitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/driver.cpp:369:12
</span><span class="">    #18 0x7f04d539c84b in main /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/driver.cpp:415
    #19 0x7f04d362eeac in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x1eeac)
    #20 0x7f04d53317b0 in _start (/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build_msan/bin/clang-3.6+0x6357b0)
</span></pre></div><div><span class=""><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Dec 6, 2014 at 2:51 AM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Sat Dec  6 04:51:40 2014<br>
New Revision: 223583<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=223583&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=223583&view=rev</a><br>
Log:<br>
InstSimplify: Optimize away useless unsigned comparisons<br>
<br>
Code like X < Y && Y == 0 should always be folded away to false.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp<br>
    llvm/trunk/lib/IR/ConstantFold.cpp<br>
    llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll<br>
<br>
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=223583&r1=223582&r2=223583&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=223583&r1=223582&r2=223583&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Sat Dec  6 04:51:40 2014<br>
@@ -1443,12 +1443,57 @@ Value *llvm::SimplifyAShrInst(Value *Op0<br>
                             RecursionLimit);<br>
 }<br>
<br>
+static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp,<br>
+                                         ICmpInst *UnsignedICmp, bool IsAnd) {<br>
+  Value *X, *Y;<br>
+<br>
+  ICmpInst::Predicate EqPred;<br>
+  if (!match(ZeroICmp, m_ICmp(EqPred, m_Value(Y), m_Zero())) &&<br>
+      ICmpInst::isEquality(EqPred))<br>
+    return nullptr;<br>
+<br>
+  ICmpInst::Predicate UnsignedPred;<br>
+  if (match(UnsignedICmp, m_ICmp(UnsignedPred, m_Value(X), m_Specific(Y))) &&<br>
+      ICmpInst::isUnsigned(UnsignedPred))<br>
+    ;<br>
+  else if (match(UnsignedICmp,<br>
+                 m_ICmp(UnsignedPred, m_Value(Y), m_Specific(X))) &&<br>
+           ICmpInst::isUnsigned(UnsignedPred))<br>
+    UnsignedPred = ICmpInst::getSwappedPredicate(UnsignedPred);<br>
+  else<br>
+    return nullptr;<br>
+<br>
+  // X < Y && Y != 0  -->  X < Y<br>
+  // X < Y || Y != 0  -->  Y != 0<br>
+  if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_NE)<br>
+    return IsAnd ? UnsignedICmp : ZeroICmp;<br>
+<br>
+  // X >= Y || Y != 0  -->  true<br>
+  // X >= Y || Y == 0  -->  X >= Y<br>
+  if (UnsignedPred == ICmpInst::ICMP_UGE && !IsAnd) {<br>
+    if (EqPred == ICmpInst::ICMP_NE)<br>
+      return getTrue(UnsignedICmp->getType());<br>
+    return UnsignedICmp;<br>
+  }<br>
+<br>
+  // X < Y && Y == 0  -->  false<br>
+  if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ &&<br>
+      IsAnd)<br>
+    return getFalse(UnsignedICmp->getType());<br>
+<br>
+  return nullptr;<br>
+}<br>
+<br>
 // Simplify (and (icmp ...) (icmp ...)) to true when we can tell that the range<br>
 // of possible values cannot be satisfied.<br>
 static Value *SimplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1) {<br>
   ICmpInst::Predicate Pred0, Pred1;<br>
   ConstantInt *CI1, *CI2;<br>
   Value *V;<br>
+<br>
+  if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true))<br>
+    return X;<br>
+<br>
   if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_ConstantInt(CI1)),<br>
                          m_ConstantInt(CI2))))<br>
    return nullptr;<br>
@@ -1602,6 +1647,10 @@ static Value *SimplifyOrOfICmps(ICmpInst<br>
   ICmpInst::Predicate Pred0, Pred1;<br>
   ConstantInt *CI1, *CI2;<br>
   Value *V;<br>
+<br>
+  if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false))<br>
+    return X;<br>
+<br>
   if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_ConstantInt(CI1)),<br>
                          m_ConstantInt(CI2))))<br>
    return nullptr;<br>
<br>
Modified: llvm/trunk/lib/IR/ConstantFold.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/ConstantFold.cpp?rev=223583&r1=223582&r2=223583&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/ConstantFold.cpp?rev=223583&r1=223582&r2=223583&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/ConstantFold.cpp (original)<br>
+++ llvm/trunk/lib/IR/ConstantFold.cpp Sat Dec  6 04:51:40 2014<br>
@@ -1350,7 +1350,7 @@ static ICmpInst::Predicate areGlobalsPot<br>
                                                       const GlobalValue *GV2) {<br>
   // Don't try to decide equality of aliases.<br>
   if (!isa<GlobalAlias>(GV1) && !isa<GlobalAlias>(GV2))<br>
-    if (!GV1->hasExternalWeakLinkage() || !GV2->hasExternalWeakLinkage())<br>
+    if (!GV1->hasExternalWeakLinkage() && !GV2->hasExternalWeakLinkage())<br>
       return ICmpInst::ICMP_NE;<br>
   return ICmpInst::BAD_ICMP_PREDICATE;<br>
 }<br>
<br>
Modified: llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll?rev=223583&r1=223582&r2=223583&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll?rev=223583&r1=223582&r2=223583&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll Sat Dec  6 04:51:40 2014<br>
@@ -155,3 +155,51 @@ define i32 @neg_nuw(i32 %x) {<br>
   ret i32 %neg<br>
 ; CHECK: ret i32 0<br>
 }<br>
+<br>
+define i1 @and_icmp1(i32 %x, i32 %y) {<br>
+  %1 = icmp ult i32 %x, %y<br>
+  %2 = icmp ne i32 %y, 0<br>
+  %3 = and i1 %1, %2<br>
+  ret i1 %3<br>
+}<br>
+; CHECK-LABEL: @and_icmp1(<br>
+; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y<br>
+; CHECK: ret i1 %[[cmp]]<br>
+<br>
+define i1 @and_icmp2(i32 %x, i32 %y) {<br>
+  %1 = icmp ult i32 %x, %y<br>
+  %2 = icmp eq i32 %y, 0<br>
+  %3 = and i1 %1, %2<br>
+  ret i1 %3<br>
+}<br>
+; CHECK-LABEL: @and_icmp2(<br>
+; CHECK: ret i1 false<br>
+<br>
+define i1 @or_icmp1(i32 %x, i32 %y) {<br>
+  %1 = icmp ult i32 %x, %y<br>
+  %2 = icmp ne i32 %y, 0<br>
+  %3 = or i1 %1, %2<br>
+  ret i1 %3<br>
+}<br>
+; CHECK-LABEL: @or_icmp1(<br>
+; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0<br>
+; CHECK: ret i1 %[[cmp]]<br>
+<br>
+define i1 @or_icmp2(i32 %x, i32 %y) {<br>
+  %1 = icmp uge i32 %x, %y<br>
+  %2 = icmp ne i32 %y, 0<br>
+  %3 = or i1 %1, %2<br>
+  ret i1 %3<br>
+}<br>
+; CHECK-LABEL: @or_icmp2(<br>
+; CHECK: ret i1 true<br>
+<br>
+define i1 @or_icmp3(i32 %x, i32 %y) {<br>
+  %1 = icmp uge i32 %x, %y<br>
+  %2 = icmp eq i32 %y, 0<br>
+  %3 = or i1 %1, %2<br>
+  ret i1 %3<br>
+}<br>
+; CHECK-LABEL: @or_icmp3(<br>
+; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y<br>
+; CHECK: ret i1 %[[cmp]]<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>