
From: brangdon@cix.compulink.co.uk (Dave Harris)
In-Reply-To: <200509282055.j8SKtbXI017230@shannonhoon.balstatdev.susq.com> stewart@sig.com (Rob Stewart) wrote (abridged):
if (!e) { BOOST_ASSERT(false); __assume(false); }
The optimizer can't elide the entire else clause because BOOST_ASSERT(false) is in it.
Do you agree that if the code was:
int x = 0; if (!e) { ++x; __assume(false); } cout << x;
then the compiler can elide the increment?
No. Having said that, do let me explain that I have *no* experience with __assume(). I am working only from the previously linked documentation and intuition.
At this stage I am trying to convince myself that you understand the point I was making, whether or not you agree with how it applies to BOOST_ASSERT. __assume(false) can have retrospective effects.
If it can, indeed, apply retroactively, as I think you meant, then I'm thoroughly confused as to how it works and how one can apply it consistently. To my way of thinking, it tells the optimizer than any code following the directive, until the end of the scope, can be optimized assuming the condition holds. I can't imagine how the optimizer could safely assume that the condition holds throughout the scope in which it appears, including previous to the directive, but compiler magic can often do wondrous things! (Note that __assume(false) is useless, for it is an expression that the optimizer cannot use to optimize anything. So, while I understand that you were trying to simplify things for the discussion, let's also not lose sight of what is really meant when writing __assume(false) in the above examples.) -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;