Switch to a signed representation for the dynamic offsets while walking
authorChandler Carruth <chandlerc@gmail.com>
Sun, 23 Sep 2012 11:43:14 +0000 (11:43 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 23 Sep 2012 11:43:14 +0000 (11:43 +0000)
commit02e92a0b5dd75514c8489d3f87fe7c5262ca6290
tree4f6a787ad4c28321124567584dda08223be191c2
parent85aa4f6eee9c055c7911656e9d1a018b6088eb73
Switch to a signed representation for the dynamic offsets while walking
across the uses of the alloca. It's entirely possible for negative
numbers to come up here, and in some rare cases simply doing the 2's
complement arithmetic isn't the correct decision. Notably, we can't zext
the index of the GEP. The definition of GEP is that these offsets are
sign extended or truncated to the size of the pointer, and then wrapping
2's complement arithmetic used.

This patch fixes an issue that comes up with *no* input from the
buildbots or bootstrap afaict. The only place where it manifested,
disturbingly, is Clang's own regression test suite. A reduced and
targeted collection of tests are added to cope with this. Note that I've
tried to pin down the potential cases of overflow, but may have missed
some cases. I've tried to add a few cases to test this, but its hard
because LLVM has quite limited support for >64bit constructs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164475 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/SROA.cpp
test/Transforms/SROA/basictest.ll