https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61839

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2014-07-23
            Summary|More optimize opportunity   |More optimize opportunity
                   |                            |for VRP
     Ever confirmed|0                           |1
      Known to fail|                            |4.10.0

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  This is straight-line (A) code vs. if-code (B) that makes the
difference, introduced by fold already:

--- a/t.c.003t.original 2014-07-23 14:48:48.984335370 +0200
+++ b/t.c.003t.original 2014-07-23 14:46:19.224345681 +0200
@@ -11,7 +11,7 @@
     int a = -1;
     volatile unsigned int b = 1;
     int c = 1;
-  c = b != 0 ? 486097858 : 972195717;
+  c = a + 972195718 >> (b != 0);
   if (c == 486097858)
     {
       (void) 0;

in the bad case we have

  <bb 2>:
  b ={v} 1;
  b.0_3 ={v} b;
  _4 = b.0_3 != 0;
  _5 = (int) _4;
  c_6 = 972195717 >> _5;
  if (c_6 == 486097858)
...

until the very end, not transforming c_6.  Note that VRP could do the
missing transform as it knows that _5 is [0, 1] (it has to jump through
the shift - the value-range for the shift itself is too broad).

If written this kind of transform should be applied more generally, not
just for shifts.  It basically wants to ask whether a conditional test
can be carried out against another SSA name (and another constant) if
an intermediate compute can be omitted in that case.

Reply via email to