<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div></div><div><br class=""></div><div>It's one of source files of ClamAV, which is a part of LLVM test-suite. Compile time on this file increased almost 3x in my preliminary measurements (and looking at the source, function "body" has a lot of ORs, so probably it's the culprit).</div><div><br class=""></div><div>Michael<br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">-Eli</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On 4/20/2017 1:02 PM, Mikhail Zolotukhin wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">Hi Eli,<br class=""><br class="">It looks like this change caused a big compile time and codesize regression on clamscan [1]. Is it expected, and if so, are there any gains from this change that overweigh the losses? I realize that the change itself looks right useful, but if we get nothing from it then probably we should find a way to mitigate negative effects first.<br class=""><br class="">Thanks,<br class="">Michael<br class=""><br class="">[1] <a href="http://104.154.54.203/db_default/v4/nts/44526" class="">http://104.154.54.203/db_default/v4/nts/44526</a><br class=""><br class=""><br class=""><blockquote type="cite" class="">On Apr 19, 2017, at 1:19 PM, Eli Friedman via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""><br class="">Author: efriedma<br class="">Date: Wed Apr 19 15:19:58 2017<br class="">New Revision: 300746<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=300746&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=300746&view=rev</a><br class="">Log:<br class="">[SCEV] Make SCEV or modeling more aggressive.<br class=""><br class="">Use haveNoCommonBitsSet to figure out whether an "or" instruction<br class="">is equivalent to addition. This handles more cases than just<br class="">checking for a constant on the RHS.<br class=""><br class="">Differential Revision: <a href="https://reviews.llvm.org/D32239" class="">https://reviews.llvm.org/D32239</a><br class=""><br class=""><br class="">Added:<br class="">   llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll<br class="">Modified:<br class="">   llvm/trunk/lib/Analysis/ScalarEvolution.cpp<br class=""><br class="">Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=300746&r1=300745&r2=300746&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=300746&r1=300745&r2=300746&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)<br class="">+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Wed Apr 19 15:19:58 2017<br class="">@@ -5328,28 +5328,12 @@ const SCEV *ScalarEvolution::createSCEV(<br class="">      break;<br class=""><br class="">    case Instruction::Or:<br class="">-      // If the RHS of the Or is a constant, we may have something like:<br class="">-      // X*4+1 which got turned into X*4|1.  Handle this as an Add so loop<br class="">-      // optimizations will transparently handle this case.<br class="">-      //<br class="">-      // In order for this transformation to be safe, the LHS must be of the<br class="">-      // form X*(2^n) and the Or constant must be less than 2^n.<br class="">-      if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->RHS)) {<br class="">-        const SCEV *LHS = getSCEV(BO->LHS);<br class="">-        const APInt &CIVal = CI->getValue();<br class="">-        if (GetMinTrailingZeros(LHS) >=<br class="">-            (CIVal.getBitWidth() - CIVal.countLeadingZeros())) {<br class="">-          // Build a plain add SCEV.<br class="">-          const SCEV *S = getAddExpr(LHS, getSCEV(CI));<br class="">-          // If the LHS of the add was an addrec and it has no-wrap flags,<br class="">-          // transfer the no-wrap flags, since an or won't introduce a wrap.<br class="">-          if (const SCEVAddRecExpr *NewAR = dyn_cast<SCEVAddRecExpr>(S)) {<br class="">-            const SCEVAddRecExpr *OldAR = cast<SCEVAddRecExpr>(LHS);<br class="">-            const_cast<SCEVAddRecExpr *>(NewAR)->setNoWrapFlags(<br class="">-                OldAR->getNoWrapFlags());<br class="">-          }<br class="">-          return S;<br class="">-        }<br class="">+      // Use ValueTracking to check whether this is actually an add.<br class="">+      if (haveNoCommonBitsSet(BO->LHS, BO->RHS, getDataLayout(), &AC,<br class="">+                              nullptr, &DT)) {<br class="">+        // There aren't any common bits set, so the add can't wrap.<br class="">+        auto Flags = SCEV::NoWrapFlags(SCEV::FlagNUW | SCEV::FlagNSW);<br class="">+        return getAddExpr(getSCEV(BO->LHS), getSCEV(BO->RHS), Flags);<br class="">      }<br class="">      break;<br class=""><br class=""><br class="">Added: llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll?rev=300746&view=auto" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll?rev=300746&view=auto</a><br class="">==============================================================================<br class="">--- llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll (added)<br class="">+++ llvm/trunk/test/Analysis/ScalarEvolution/or-as-add.ll Wed Apr 19 15:19:58 2017<br class="">@@ -0,0 +1,38 @@<br class="">+; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s<br class="">+<br class="">+declare void @z(i32)<br class="">+declare void @z2(i64)<br class="">+<br class="">+define void @fun(i1 %bool, i32 %x) {<br class="">+entry:<br class="">+        br label %body<br class="">+body:<br class="">+        %i = phi i32 [ 0, %entry ], [ %i.next, %body ]<br class="">+        %bottom_zero = mul i32 %i, 2<br class="">+        %a = or i32 %bottom_zero, 1<br class="">+        call void @z(i32 %a)<br class="">+        %bool_ext = zext i1 %bool to i32<br class="">+        %b = or i32 %bool_ext, %bottom_zero<br class="">+        call void @z(i32 %b)<br class="">+        %shifted = lshr i32 %x, 31<br class="">+        %c = or i32 %shifted, %bottom_zero<br class="">+        call void @z(i32 %c)<br class="">+        %i_ext = zext i32 %i to i64<br class="">+        %d = or i64 %i_ext, 4294967296<br class="">+        call void @z2(i64 %d)<br class="">+        %i.next = add i32 %i, 1<br class="">+        %cond = icmp eq i32 %i.next, 10<br class="">+        br i1 %cond, label %exit, label %body<br class="">+exit:<br class="">+        ret void<br class="">+}<br class="">+<br class="">+; CHECK: %a = or i32 %bottom_zero, 1<br class="">+; CHECK-NEXT: -->  {1,+,2}<%body><br class="">+; CHECK: %b = or i32 %bool_ext, %bottom_zero<br class="">+; CHECK-NEXT: -->  {(zext i1 %bool to i32),+,2}<br class="">+; CHECK: %c = or i32 %shifted, %bottom_zero<br class="">+; CHECK-NEXT: -->  {(%x /u -2147483648),+,2}<%body><br class="">+; CHECK: %d = or i64 %i_ext, 4294967296<br class="">+; CHECK-NEXT: -->  {4294967296,+,1}<nuw><nsw><%body><br class="">+<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></blockquote></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">--<span class="Apple-converted-space"> </span></span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Employee of Qualcomm Innovation Center, Inc.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</span></div></blockquote></div><br class=""></body></html>