http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58662

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
It looks like changing the testcase line

  d = foo (a == 0, (0, 35536)); 

to

  d = foo (a == 0, -30000);  

fixes it.  _No_ IL difference in 065t.mergephi2, but then 066t.vrp1 has

 main ()
 {
   char e;
@@ -39,6 +35,7 @@
   _Bool _4;
   int _5;
   int _7;
+  int c.4_9;
   int b.5_11;
   int _12;

@@ -46,22 +43,37 @@
   a.0_3 = a;
   _4 = a.0_3 == 0;
   _5 = (int) _4;
-  _12 = 0;
-  d = 0;
-  _7 = 0;
-  e_8 = 0;
-  iftmp.3_1 = 0;
-  b ={v} 0;
-  b.5_11 ={v} b;
-  if (b.5_11 != 0)
+  _12 = _5 / -30000;
+  d = _12;
+  _7 = _12 % 14;
+  e_8 = (char) _7;
+  if (_7 != 0)
     goto <bb 3>;
   else
     goto <bb 4>;

   <bb 3>:
-  abort ();
+  c.4_9 = c;
+  if (c.4_9 != 0)
+    goto <bb 5>;
+  else
+    goto <bb 4>;

   <bb 4>:
+
+  <bb 5>:
+  # iftmp.3_1 = PHI <1(3), 0(4)>
+  b ={v} iftmp.3_1;
+  b.5_11 ={v} b;
+  if (b.5_11 != 0)
+    goto <bb 6>;
+  else
+    goto <bb 7>;
+
+  <bb 6>:
+  abort ();
+
+  <bb 7>:
   return 0;

 }

what?!

Reduced testcase:

extern void abort (void);

int a, c, d;
volatile int b;

static int
foo (int p1, short p2)
{
  return p1 / p2;
}

int
main ()
{
  char e;
  d = foo (a == 0, (0, 35536)); 
  e = d % 14;
  b = e && c;
  if (b != 0)
    abort ();
  return 0;
}

Reply via email to