Hello,

For the testcase below, the tree-ssa-sink pass sinks the first a = b + c;
assignment within the if branch.

This is problematic when the + operation on floats could trap, as it gets moved
out of the path that dominates the call in the else branch and a trap on the
original + should prevent the call from taking place.

The attached patch is a proposal to address this by refusing to sink statements
that could trap, except load/stores. Trapping loads or stores typically yield
undefined behavior anyway, and not sinking a load or store as soon as it is
potentially trapping pessimizes quite a bit for no valid reason.

Bootstrapped and regression tested on x86_64-linux-gnu.

OK to commit ?

Thanks in advance for your feedback,

With Kind Regards,

Olivier


2014-09-03  Olivier Hainque  <hain...@adacore.com>

        * tree-ssa-sink.c (statement_sink_location): Don't sink !load-or-store
        stmts that could trap.

        testsuite/
        * gcc.dg/tree-ssa/ssa-sink-13.c: New test.


[see attached file: sinktrap.diff]

--

extern void bar ();

float foo (int call)
{
  float a, b, c;

  a = b + c;
  if (!call)
    ;
  else
    {
      bar ();
      b = c * 2;
      a = b + c;
    }

  return a;
}

Attachment: sinktrap.diff
Description: Binary data

Reply via email to