<div dir="ltr"><div><div>Hi Adrian -<br><br></div>Sorry - I broke lots of bots with that one. <br><br>I reverted r311333 at:<br><a href="https://reviews.llvm.org/rL311340" rel="noreferrer" target="_blank">https://reviews.llvm.org/rL311<wbr>340</a><br><br></div>And recommitted with a fix at:<br><a href="https://reviews.llvm.org/rL311366" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>rL311366</a><div><br></div><div>Please let me know if you still see problems with the new version.<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 21, 2017 at 2:19 PM, Adrian Prantl <span dir="ltr"><<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Here's a link to the failure in case you want to reproduce this:<div><br></div><div><a href="http://green.lab.llvm.org/green/job/perf_darwin_x86_O3flto/12409/consoleFull#2864721549ba4694-19c4-4d7e-bec5-911270d8a58c" target="_blank">http://green.lab.llvm.org/<wbr>green/job/perf_darwin_x86_<wbr>O3flto/12409/consoleFull#<wbr>2864721549ba4694-19c4-4d7e-<wbr>bec5-911270d8a58c</a></div><span class="HOEnZb"><font color="#888888"><div><br></div></font></span><div><span class="HOEnZb"><font color="#888888">-- adrian</font></span><div><div class="h5"><br><div><blockquote type="cite"><div>On Aug 21, 2017, at 1:16 PM, Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="m_-6939417757553654197Apple-interchange-newline"><div><div>The green dragon LNT bot has started to timeout between r311333 and r311336.<br>I logged into the machine and attached lldb to a clang job that has been running for more than 60min.<br><br>Could you please take a look and/or revert this commit?<br><br>thanks,<br>Adrian<br><br><br>green-dragon-06:~ buildslave$ lldb -p  33286<br>(lldb) process attach --pid 33286<br>Process 33286 stopped<br>* thread #1: tid = 0xac2ec5, 0x000000010d76788f clang-6.0`llvm::<wbr>ConstantFoldLoadFromConstPtr(<wbr>llvm::Constant*, llvm::Type*, llvm::DataLayout const&) + 927, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP<br>    frame #0: 0x000000010d76788f clang-6.0`llvm::<wbr>ConstantFoldLoadFromConstPtr(<wbr>llvm::Constant*, llvm::Type*, llvm::DataLayout const&) + 927<br>clang-6.0`llvm::<wbr>ConstantFoldLoadFromConstPtr:<br>->  0x10d76788f <+927>: testb  $0x1, 0x50(%rbx)<br>    0x10d767893 <+931>: je     0x10d767e06               ; <+2326><br>    0x10d767899 <+937>: movq   %rbx, %rdi<br>    0x10d76789c <+940>: callq  0x10dcc6690               ; llvm::GlobalValue::<wbr>isDeclaration() const<br><br>Executable module set to "/Users/buildslave/jenkins/<wbr>workspace/perf_darwin_x86_<wbr>O3flto/host-compiler/bin/<wbr>clang-6.0".<br>Architecture set to: x86_64-apple-macosx.<br>(lldb) bt<br>* thread #1: tid = 0xac2ec5, 0x000000010d76788f clang-6.0`llvm::<wbr>ConstantFoldLoadFromConstPtr(<wbr>llvm::Constant*, llvm::Type*, llvm::DataLayout const&) + 927, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP<br>  * frame #0: 0x000000010d76788f clang-6.0`llvm::<wbr>ConstantFoldLoadFromConstPtr(<wbr>llvm::Constant*, llvm::Type*, llvm::DataLayout const&) + 927<br>    frame #1: 0x00007feb2db8e2d8<br>    frame #2: 0x000000010e35e06f clang-6.0`llvm::<wbr>LibCallSimplifier::<wbr>optimizeMemCmp(llvm::CallInst*<wbr>, llvm::IRBuilder<llvm::<wbr>ConstantFolder, llvm::<wbr>IRBuilderDefaultInserter>&) + 1119<br>    frame #3: 0x000000010e365e7a clang-6.0`llvm::<wbr>LibCallSimplifier::<wbr>optimizeStringMemoryLibCall(<wbr>llvm::CallInst*, llvm::IRBuilder<llvm::<wbr>ConstantFolder, llvm::<wbr>IRBuilderDefaultInserter>&) + 266<br>    frame #4: 0x000000010e3670b8 clang-6.0`llvm::<wbr>LibCallSimplifier::<wbr>optimizeCall(llvm::CallInst*) + 1080<br>    frame #5: 0x000000010de61193 clang-6.0`llvm::InstCombiner::<wbr>tryOptimizeCall(llvm::<wbr>CallInst*) + 99<br>    frame #6: 0x000000010de5c759 clang-6.0`llvm::InstCombiner::<wbr>visitCallSite(llvm::CallSite) + 2761<br>    frame #7: 0x000000010de57aa6 clang-6.0`llvm::InstCombiner::<wbr>visitCallInst(llvm::CallInst&) + 55574<br>    frame #8: 0x000000010de1ef16 clang-6.0`llvm::InstCombiner::<wbr>run() + 3222<br>    frame #9: 0x000000010de20be9 clang-6.0`<wbr>combineInstructionsOverFunctio<wbr>n(llvm::Function&, llvm::InstCombineWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::DominatorTree&, llvm::<wbr>OptimizationRemarkEmitter&, bool, llvm::LoopInfo*) + 4201<br>    frame #10: 0x000000010de21207 clang-6.0`llvm::<wbr>InstructionCombiningPass::<wbr>runOnFunction(llvm::Function&) + 631<br>    frame #11: 0x000000010dcfa353 clang-6.0`llvm::FPPassManager:<wbr>:runOnFunction(llvm::Function&<wbr>) + 547<br>    frame #12: 0x000000010dcfa5b3 clang-6.0`llvm::FPPassManager:<wbr>:runOnModule(llvm::Module&) + 51<br>    frame #13: 0x000000010dcfaa3e clang-6.0`llvm::legacy::<wbr>PassManagerImpl::run(llvm::<wbr>Module&) + 766<br>    frame #14: 0x000000010e49e2b4 clang-6.0`clang::<wbr>EmitBackendOutput(clang::<wbr>DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::<wbr>raw_pwrite_stream, std::__1::default_delete<llvm:<wbr>:raw_pwrite_stream> >) + 15172<br>    frame #15: 0x000000010e6d5ea3 clang-6.0`clang::<wbr>BackendConsumer::<wbr>HandleTranslationUnit(clang::<wbr>ASTContext&) + 947<br>    frame #16: 0x000000010f0ad595 clang-6.0`clang::ParseAST(<wbr>clang::Sema&, bool, bool) + 469<br>    frame #17: 0x000000010e944f2c clang-6.0`clang::<wbr>FrontendAction::Execute() + 76<br>    frame #18: 0x000000010e901021 clang-6.0`clang::<wbr>CompilerInstance::<wbr>ExecuteAction(clang::<wbr>FrontendAction&) + 1217<br>    frame #19: 0x000000010e9a9695 clang-6.0`clang::<wbr>ExecuteCompilerInvocation(<wbr>clang::CompilerInstance*) + 4949<br>    frame #20: 0x000000010cad1492 clang-6.0`cc1_main(llvm::<wbr>ArrayRef<char const*>, char const*, void*) + 1394<br>    frame #21: 0x000000010cacfb43 clang-6.0`main + 11939<br>    frame #22: 0x00007fff903cc5ad libdyld.dylib`start + 1<br>    frame #23: 0x00007fff903cc5ad libdyld.dylib`start + 1<br><br><blockquote type="cite">On Aug 21, 2017, at 6:55 AM, Sanjay Patel via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br><br>Author: spatel<br>Date: Mon Aug 21 06:55:49 2017<br>New Revision: 311333<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=311333&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=311333&view=rev</a><br>Log:<br>[LibCallSimplifier] try harder to fold memcmp with constant arguments<br><br>Try to fold:<br>memcmp(X, C, ConstantLength) == 0 --> load X == *C<br><br>Without this change, we're unnecessarily checking the alignment of the constant data, <br>so we miss the transform in the first 2 tests in the patch.<br><br>I noted this shortcoming of LibCallSimpifier in one of the recent CGP memcmp expansion <br>patches. This doesn't help the example in:<br><a href="https://bugs.llvm.org/show_bug.cgi?id=34032#c13" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=34032#c13</a><br>...directly, but it's worth short-circuiting more of these simple cases since we're <br>already trying to do that.<br><br>The benefit of transforming to load+cmp is that existing IR analysis/transforms may<br>further simplify that code. For example, if the load of the variable is common to <br>multiple memcmp calls, CSE can remove the duplicate instructions.<br><br>Differential Revision: <a href="https://reviews.llvm.org/D36922" target="_blank">https://reviews.llvm.org/<wbr>D36922</a><br><br>Added:<br>   llvm/trunk/test/Transforms/<wbr>InstCombine/memcmp-constant-<wbr>fold.ll<br>Modified:<br>   llvm/trunk/lib/Transforms/<wbr>Utils/SimplifyLibCalls.cpp<br><br>Modified: llvm/trunk/lib/Transforms/<wbr>Utils/SimplifyLibCalls.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=311333&r1=311332&r2=311333&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Utils/<wbr>SimplifyLibCalls.cpp?rev=<wbr>311333&r1=311332&r2=311333&<wbr>view=diff</a><br>==============================<wbr>==============================<wbr>==================<br>--- llvm/trunk/lib/Transforms/<wbr>Utils/SimplifyLibCalls.cpp (original)<br>+++ llvm/trunk/lib/Transforms/<wbr>Utils/SimplifyLibCalls.cpp Mon Aug 21 06:55:49 2017<br>@@ -18,6 +18,7 @@<br>#include "llvm/ADT/SmallString.h"<br>#include "llvm/ADT/StringMap.h"<br>#include "llvm/ADT/Triple.h"<br>+#include "llvm/Analysis/<wbr>ConstantFolding.h"<br>#include "llvm/Analysis/<wbr>OptimizationDiagnosticInfo.h"<br>#include "llvm/Analysis/<wbr>TargetLibraryInfo.h"<br>#include "llvm/Analysis/ValueTracking.<wbr>h"<br>@@ -751,29 +752,44 @@ Value *LibCallSimplifier::<wbr>optimizeMemCmp<br>  }<br><br>  // memcmp(S1,S2,N/8)==0 -> (*(intN_t*)S1 != *(intN_t*)S2)==0<br>+  // TODO: The case where both inputs are constants does not need to be limited<br>+  // to legal integers or equality comparison. See block below this.<br>  if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityCompar<wbr>ison(CI)) {<br>-<br>    IntegerType *IntType = IntegerType::get(CI-><wbr>getContext(), Len * 8);<br>    unsigned PrefAlignment = DL.getPrefTypeAlignment(<wbr>IntType);<br><br>-    if (getKnownAlignment(LHS, DL, CI) >= PrefAlignment &&<br>-        getKnownAlignment(RHS, DL, CI) >= PrefAlignment) {<br>+    // First, see if we can fold either argument to a constant.<br>+    Value *LHSV = nullptr;<br>+    if (auto *LHSC = dyn_cast<Constant>(LHS)) {<br>+      LHSC = ConstantExpr::getBitCast(LHSC, IntType->getPointerTo());<br>+      LHSV = ConstantFoldLoadFromConstPtr(<wbr>LHSC, IntType, DL);<br>+    }<br>+    Value *RHSV = nullptr;<br>+    if (auto *RHSC = dyn_cast<Constant>(RHS)) {<br>+      RHSC = ConstantExpr::getBitCast(RHSC, IntType->getPointerTo());<br>+      RHSV = ConstantFoldLoadFromConstPtr(<wbr>RHSC, IntType, DL);<br>+    }<br><br>+    // Don't generate unaligned loads. If either source is constant data,<br>+    // alignment doesn't matter for that source because there is no load.<br>+    if (!LHSV && getKnownAlignment(LHS, DL, CI) >= PrefAlignment) {<br>      Type *LHSPtrTy =<br>          IntType-><wbr>getPointerTo(LHS->getType()-><wbr>getPointerAddressSpace());<br>+      LHSV = B.CreateLoad(B.CreateBitCast(<wbr>LHS, LHSPtrTy), "lhsv");<br>+    }<br>+<br>+    if (!RHSV && getKnownAlignment(RHS, DL, CI) >= PrefAlignment) {<br>      Type *RHSPtrTy =<br>          IntType-><wbr>getPointerTo(RHS->getType()-><wbr>getPointerAddressSpace());<br>+      RHSV = B.CreateLoad(B.CreateBitCast(<wbr>RHS, RHSPtrTy), "rhsv");<br>+    }<br><br>-      Value *LHSV =<br>-          B.CreateLoad(B.<wbr>CreateBitCast(LHS, LHSPtrTy, "lhsc"), "lhsv");<br>-      Value *RHSV =<br>-          B.CreateLoad(B.<wbr>CreateBitCast(RHS, RHSPtrTy, "rhsc"), "rhsv");<br>-<br>+    if (LHSV && RHSV)<br>      return B.CreateZExt(B.CreateICmpNE(<wbr>LHSV, RHSV), CI->getType(), "memcmp");<br>-    }<br>  }<br><br>-  // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant)<br>+  // Constant folding: memcmp(x, y, Len) -> constant (all arguments are const).<br>+  // TODO: This is limited to i8 arrays.<br>  StringRef LHSStr, RHSStr;<br>  if (getConstantStringInfo(LHS, LHSStr) &&<br>      getConstantStringInfo(<wbr>RHS, RHSStr)) {<br><br>Added: llvm/trunk/test/Transforms/<wbr>InstCombine/memcmp-constant-<wbr>fold.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/memcmp-constant-fold.ll?rev=311333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstCombine/memcmp-<wbr>constant-fold.ll?rev=311333&<wbr>view=auto</a><br>==============================<wbr>==============================<wbr>==================<br>--- llvm/trunk/test/Transforms/<wbr>InstCombine/memcmp-constant-<wbr>fold.ll (added)<br>+++ llvm/trunk/test/Transforms/<wbr>InstCombine/memcmp-constant-<wbr>fold.ll Mon Aug 21 06:55:49 2017<br>@@ -0,0 +1,65 @@<br>+; RUN: opt < %s -instcombine -S -data-layout=e-n32 | FileCheck %s --check-prefix=ALL --check-prefix=LE<br>+; RUN: opt < %s -instcombine -S -data-layout=E-n32 | FileCheck %s --check-prefix=ALL --check-prefix=BE<br>+<br>+declare i32 @memcmp(i8*, i8*, i64)<br>+<br>+; The alignment of this constant does not matter. We constant fold the load.<br>+<br>+@charbuf = private unnamed_addr constant [4 x i8] [i8 0, i8 0, i8 0, i8 1], align 1<br>+<br>+define i1 @memcmp_4bytes_unaligned_<wbr>constant_i8(i8* align 4 %x) {<br>+; LE-LABEL: @memcmp_4bytes_unaligned_<wbr>constant_i8(<br>+; LE-NEXT:    [[TMP1:%.*]] = bitcast i8* %x to i32*<br>+; LE-NEXT:    [[LHSV:%.*]] = load i32, i32* [[TMP1]], align 4<br>+; LE-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[LHSV]], 16777216<br>+; LE-NEXT:    ret i1 [[TMP2]]<br>+;<br>+; BE-LABEL: @memcmp_4bytes_unaligned_<wbr>constant_i8(<br>+; BE-NEXT:    [[TMP1:%.*]] = bitcast i8* %x to i32*<br>+; BE-NEXT:    [[LHSV:%.*]] = load i32, i32* [[TMP1]], align 4<br>+; BE-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[LHSV]], 1<br>+; BE-NEXT:    ret i1 [[TMP2]]<br>+;<br>+  %call = tail call i32 @memcmp(i8* %x, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @charbuf, i64 0, i64 0), i64 4)<br>+  %cmpeq0 = icmp eq i32 %call, 0<br>+  ret i1 %cmpeq0<br>+}<br>+<br>+; We still don't care about alignment of the constant. We are not limited to constant folding only i8 arrays.<br>+; It doesn't matter if the constant operand is the first operand to the memcmp.<br>+<br>+@intbuf_unaligned = private unnamed_addr constant [4 x i16] [i16 1, i16 2, i16 3, i16 4], align 1<br>+<br>+define i1 @memcmp_4bytes_unaligned_<wbr>constant_i16(i8* align 4 %x) {<br>+; LE-LABEL: @memcmp_4bytes_unaligned_<wbr>constant_i16(<br>+; LE-NEXT:    [[TMP1:%.*]] = bitcast i8* %x to i32*<br>+; LE-NEXT:    [[RHSV:%.*]] = load i32, i32* [[TMP1]], align 4<br>+; LE-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[RHSV]], 131073<br>+; LE-NEXT:    ret i1 [[TMP2]]<br>+;<br>+; BE-LABEL: @memcmp_4bytes_unaligned_<wbr>constant_i16(<br>+; BE-NEXT:    [[TMP1:%.*]] = bitcast i8* %x to i32*<br>+; BE-NEXT:    [[RHSV:%.*]] = load i32, i32* [[TMP1]], align 4<br>+; BE-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[RHSV]], 65538<br>+; BE-NEXT:    ret i1 [[TMP2]]<br>+;<br>+  %call = tail call i32 @memcmp(i8* bitcast (i16* getelementptr inbounds ([4 x i16], [4 x i16]* @intbuf_unaligned, i64 0, i64 0) to i8*), i8* %x, i64 4)<br>+  %cmpeq0 = icmp eq i32 %call, 0<br>+  ret i1 %cmpeq0<br>+}<br>+<br>+; TODO: Any memcmp where all arguments are constants should be constant folded. Currently, we only handle i8 array constants.<br>+<br>+@intbuf = private unnamed_addr constant [2 x i32] [i32 0, i32 1], align 4<br>+<br>+define i1 @memcmp_3bytes_aligned_<wbr>constant_i32(i8* align 4 %x) {<br>+; ALL-LABEL: @memcmp_3bytes_aligned_<wbr>constant_i32(<br>+; ALL-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(i8* bitcast (i32* getelementptr inbounds ([2 x i32], [2 x i32]* @intbuf, i64 0, i64 1) to i8*), i8* bitcast ([2 x i32]* @intbuf to i8*), i64 3)<br>+; ALL-NEXT:    [[CMPEQ0:%.*]] = icmp eq i32 [[CALL]], 0<br>+; ALL-NEXT:    ret i1 [[CMPEQ0]]<br>+;<br>+  %call = tail call i32 @memcmp(i8* bitcast (i32* getelementptr inbounds ([2 x i32], [2 x i32]* @intbuf, i64 0, i64 1) to i8*), i8* bitcast (i32* getelementptr inbounds ([2 x i32], [2 x i32]* @intbuf, i64 0, i64 0) to i8*), i64 3)<br>+  %cmpeq0 = icmp eq i32 %call, 0<br>+  ret i1 %cmpeq0<br>+}<br>+<br><br><br>______________________________<wbr>_________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br></blockquote><br>______________________________<wbr>_________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br></div></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div>