<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>