[Bug tree-optimization/84136] [6/7/8 Regression] ICE with goto to an && label in another function

2018-02-08 Thread dmalcolm at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84136

--- Comment #4 from David Malcolm  ---
Author: dmalcolm
Date: Fri Feb  9 01:07:11 2018
New Revision: 257509

URL: https://gcc.gnu.org/viewcvs?rev=257509=gcc=rev
Log:
Fix ICE in find_taken_edge_computed_goto (PR 84136)

PR 84136 reports an ICE within sccvn_dom_walker when handling a
C/C++ source file that overuses the labels-as-values extension.
The code in question stores a jump label into a global, and then
jumps to it from another function, which ICEs after inlining:

void* a;

void foo() {
  if ((a = &))
  return;

  l:;
}

int main() {
  foo();
  goto *a;

  return 0;
}

This appears to be far beyond what we claim to support in this
extension - but we shouldn't ICE.

What's happening is that, after inlining, we have usage of a *copy*
of the label, which optimizes away the if-return logic, turning it
into an infinite loop.

On entry to the sccvn_dom_walker we have this gimple:

main ()
{
  void * a.0_1;

   [count: 0]:
  a = 

   [count: 0]:
l:
  a.0_1 = a;
  goto a.0_1;
}

and:
  edge taken = find_taken_edge (bb, vn_valueize (val));
reasonably valueizes the:
  goto a.0_1;
after the:
  a = 
  a.0_1 = a;
as if it were:
  goto *

find_taken_edge_computed_goto then has:

2380  dest = label_to_block (val);
2381  if (dest)
2382{
2383  e = find_edge (bb, dest);
2384  gcc_assert (e != NULL);
2385}

which locates dest as a self-jump from block 3 back to itself.

However, the find_edge call returns NULL - it has a predecessor edge
from block 2, but no successor edges.

Hence the assertion fails and we ICE.

A successor edge from the computed goto could have been created by
make_edges if the label stmt had been in the function, but make_edges
only looks in the current function when handling computed gotos, and
the label only appeared after inlining.

The following patch removes the assertion, fixing the ICE.

gcc/testsuite/ChangeLog:
PR tree-optimization/84136
* gcc.c-torture/compile/pr84136.c: New test.

gcc/ChangeLog:
PR tree-optimization/84136
* tree-cfg.c (find_taken_edge_computed_goto): Remove assertion
that the result of find_edge is non-NULL.


Added:
trunk/gcc/testsuite/gcc.c-torture/compile/pr84136.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/testsuite/ChangeLog
trunk/gcc/tree-cfg.c

[Bug tree-optimization/84136] [6/7/8 Regression] ICE with goto to an && label in another function

2018-01-31 Thread dmalcolm at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84136

--- Comment #3 from David Malcolm  ---
Discussion/patch:
  https://gcc.gnu.org/ml/gcc-patches/2018-01/msg02451.html