Okay, bear with me here...
authorBill Wendling <isanbard@gmail.com>
Tue, 25 May 2010 21:44:26 +0000 (21:44 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 25 May 2010 21:44:26 +0000 (21:44 +0000)
commit5edfbdc9635405fe601d6d4645443d3a38c5e7b7
treeaa77fa5fdeb6487d133a82d1def78a0bb755a30d
parent02b46bc9426925b90137d264216a54aa413335fd
Okay, bear with me here...

If you have a setjmp/longjmp situation, it's possible for stack slot coloring to
reuse a stack slot before it's really dead. For instance, if we have something
like this:

1:  y = g;
    x = sigsetjmp(env, 0);
    switch (x) {
    case 1:
      /* ... */
      goto run;
    case 0:
  run:
      do_run(); /* marked as "no return" */
      break;
    case 3:
      if (...) {
        /* ... */
        goto run;
      }
      /* ... */
      break;
    }

2:  g = y;

"y" may be put onto the stack, so the expression "g = y" is relying upon the
fact that the stack slot containing "y" isn't modified between (1) and (2). But
it can be, because of the "no return" calls in there. A longjmp might come back
with 3, modify the stack slot, and then go to case 0. And it's perfectly
acceptable to reuse the stack slot there because there's no CFG flow from case 3
to (2).

The fix is to disable certain optimizations in these situations. Ideally, we'd
disable them for all "returns twice" functions. But we don't support that
attribute. Check for "setjmp" and "sigsetjmp" instead.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104640 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/StackSlotColoring.cpp