<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Aug 14, 2012, at 5:52 PM, Jordan Rose wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Author: jrose<br>Date: Tue Aug 14 19:52:00 2012<br>New Revision: 161916<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=161916&view=rev">http://llvm.org/viewvc/llvm-project?rev=161916&view=rev</a><br>Log:<br>[analyzer] Don't inline dynamic-dispatch methods unless -analyzer-ipa=dynamic.<br><br>Previously we were checking -analyzer-ipa=dynamic-bifurcate only, and<br>unconditionally inlining everything else that had an available definition,<br>even under -analyzer-ipa=inlining (but not under -analyzer-ipa=none).<br><br></div></blockquote><br></div><div>We were not inlining ObjC unless dynamic dispatch or dynamic dispatch bifurcate is turned on due to this check in ExprEngine::inlineCall. It's just not wired for C++.</div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(40, 5, 202); "><span style="color: #000000">  </span><span style="color: #8e0868">case</span><span style="color: #000000"> </span>CE_ObjCMessage<span style="color: #000000">:</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">    <span style="color: #8e0868">if</span> (!(getAnalysisManager().<span style="color: #2805ca">IPAMode</span> == DynamicDispatch ||</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">          getAnalysisManager().<span style="color: #2805ca">IPAMode</span> == DynamicDispatchBifurcate))</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(142, 8, 104); "><span style="color: #000000">      </span>return<span style="color: #000000"> </span>false<span style="color: #000000">;</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(142, 8, 104); "><span style="color: #000000"><br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(142, 8, 104); "><span style="color: #000000"><font class="Apple-style-span" face="Helvetica" size="3">That said, I think checking the flag earlier is better especially since we'll be handing more languages now.</font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(142, 8, 104); "><span style="color: #000000"><br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(142, 8, 104); "><span style="color: #000000">Anna.</span></div><blockquote type="cite"><div>Added:<br>    cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp<br>Modified:<br>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=161916&r1=161915&r2=161916&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=161916&r1=161915&r2=161916&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp Tue Aug 14 19:52:00 2012<br>@@ -555,12 +555,18 @@<br>     RuntimeDefinition RD = Call->getRuntimeDefinition();<br>     const Decl *D = RD.getDecl();<br>     if (D) {<br>-      // Explore with and without inlining the call.<br>-      if (RD.mayHaveOtherDefinitions() &&<br>-          getAnalysisManager().IPAMode == DynamicDispatchBifurcate) {<br>-        BifurcateCall(RD.getDispatchRegion(), *Call, D, Bldr, Pred);<br>-        return;<br>+      if (RD.mayHaveOtherDefinitions()) {<br>+        // Explore with and without inlining the call.<br>+        if (getAnalysisManager().IPAMode == DynamicDispatchBifurcate) {<br>+          BifurcateCall(RD.getDispatchRegion(), *Call, D, Bldr, Pred);<br>+          return;<br>+        }<br>+<br>+        // Don't inline if we're not in any dynamic dispatch mode.<br>+        if (getAnalysisManager().IPAMode != DynamicDispatch)<br>+          return;<br>       }<br>+<br>       // We are not bifurcating and we do have a Decl, so just inline.<br>       if (inlineCall(*Call, D, Bldr, Pred, State))<br>         return;<br>@@ -575,6 +581,7 @@<br>                                const CallEvent &Call, const Decl *D,<br>                                NodeBuilder &Bldr, ExplodedNode *Pred) {<br>   assert(BifurReg);<br>+  BifurReg = BifurReg->StripCasts();<br><br>   // Check if we've performed the split already - note, we only want<br>   // to split the path once per memory region.<br><br>Added: cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp?rev=161916&view=auto">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp?rev=161916&view=auto</a><br>==============================================================================<br>--- cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp (added)<br>+++ cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp Tue Aug 14 19:52:00 2012<br>@@ -0,0 +1,17 @@<br>+// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic-bifurcate -verify %s<br>+<br>+void clang_analyzer_eval(bool);<br>+<br>+class A {<br>+public:<br>+  virtual int get() { return 0; }<br>+};<br>+<br>+void testBifurcation(A *a) {<br>+  clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}}<br>+}<br>+<br>+void testKnown() {<br>+  A a;<br>+  clang_analyzer_eval(a.get() == 0); // expected-warning{{TRUE}}<br>+}<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br></div></blockquote></div><br></body></html>