[GlobalsAA] Partially back out r248576
authorJames Molloy <james.molloy@arm.com>
Thu, 7 Jan 2016 13:33:28 +0000 (13:33 +0000)
committerJames Molloy <james.molloy@arm.com>
Thu, 7 Jan 2016 13:33:28 +0000 (13:33 +0000)
commit6a8908e97960a3929876e52fe57a46982230bb03
treeb1ea2f3a93f4277e952817915d976b7a29d4ee4d
parent699e85dc452a2d54e9241ebe8ebbc48827b931c8
[GlobalsAA] Partially back out r248576

See PR25822 for a more full summary, but we were conflating the concepts of "capture" and "escape". We were proving nocapture and using that proof to infer noescape, which is not true. Escaped-ness is a function-local property - as soon as a value is used in a call argument it escapes. Capturedness is a related but distinct property. It implies a *temporally limited* escape. Consider:

  static int a;
  int b;
  int g(int * nocapture arg);
  int f() {
    a = 2;  // Even though a escapes to g, it is not captured so can be treated as non-escaping here.
    g(&a);  // But here it must be treated as escaping.
    g(&b);  // Now that g(&a) has returned we know it was not captured so we can treat it as non-escaping again.
  }

The original commit did not sufficiently understand this nuance and so caused PR25822 and PR26046.

r248576 included both a performance improvement (which has been backed out) and a related conformance fix (which has been kept along with its testcase).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257058 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/GlobalsModRef.cpp
test/Analysis/GlobalsModRef/nocapture.ll [deleted file]