LLVM backend for 6502
Go to file
Chandler Carruth 77c1270033 Refactor the PartitionUse structure to actually use the Use* instead of
a pair of instructions, one for the used pointer and the second for the
user. This simplifies the representation and also makes it more dense.

This was noticed because of the miscompile in PR13926. In that case, we
were running up against a fundamental "bad idea" in the speculation of
PHI and select instructions: the speculation and rewriting are
interleaved, which requires phi speculation to also perform load
rewriting! This is bad, and causes us to miss opportunities to do (for
example) vector rewriting only exposed after PHI speculation, etc etc.
It also, in the old system, required us to insert *new* load uses into
the current partition's use list, which would then be ignored during
rewriting because we had already extracted an end iterator for the use
list. The appending behavior (and much of the other oddities) stem from
the strange de-duplication strategy in the PartitionUse builder.
Amusingly, all this went without notice for so long because it could
only be triggered by having *different* GEPs into the same partition of
the same alloca, where both different GEPs were operands of a single
PHI, and where the GEP which was not encountered first also had multiple
uses within that same PHI node... Hence the insane steps required to
reproduce.

So, step one in fixing this fundamental bad idea is to make the
PartitionUse actually contain a Use*, and to make the builder do proper
deduplication instead of funky de-duplication. This is enough to remove
the appending behavior, and fix the miscompile in PR13926, but there is
more work to be done here. Subsequent commits will lift the speculation
into its own visitor. It'll be a useful step toward potentially
extracting all of the speculation logic into a generic utility
transform.

The existing PHI test case for repeated operands has been made more
extreme to catch even these issues. This test case, run through the old
pass, will exactly reproduce the miscompile from PR13926. ;] We were so
close here!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164925 91177308-0d34-0410-b5e6-96231b3b80d8
2012-10-01 01:49:22 +00:00
autoconf Removing dependency on third party library for Intel JIT event support. 2012-09-28 17:35:20 +00:00
bindings add support for ocaml 3.12 2012-09-02 14:42:56 +00:00
cmake CMake toolchain file for Android NDK. 2012-09-11 11:54:27 +00:00
docs RST docs: convert HTML escapes to plain text in code examples. 2012-09-30 20:51:02 +00:00
examples Move llvm/Support/IRBuilder.h -> llvm/IRBuilder.h 2012-06-29 12:38:19 +00:00
include Add LLVM support for Swift. 2012-09-29 21:43:49 +00:00
lib Refactor the PartitionUse structure to actually use the Use* instead of 2012-10-01 01:49:22 +00:00
projects Revert 'Fix a typo 'iff' => 'if''. iff is an abreviation of if and only if. See: http://en.wikipedia.org/wiki/If_and_only_if Commit 164767 2012-09-27 10:14:43 +00:00
runtime libprofile: [CMake] Let libprofile_rt be not loadable_module but shared library. Autoconf's one does so. 2012-08-29 00:37:51 +00:00
test Refactor the PartitionUse structure to actually use the Use* instead of 2012-10-01 01:49:22 +00:00
tools Removing dependency on third party library for Intel JIT event support. 2012-09-28 17:35:20 +00:00
unittests Removing dependency on third party library for Intel JIT event support. 2012-09-28 17:35:20 +00:00
utils Revert 'Fix a typo 'iff' => 'if''. iff is an abreviation of if and only if. See: http://en.wikipedia.org/wiki/If_and_only_if Commit 164767 2012-09-27 10:14:43 +00:00
.gitignore Ignore the documentation-suggested location for compile_commands.json 2012-08-21 19:23:30 +00:00
CMakeLists.txt Removing dependency on third party library for Intel JIT event support. 2012-09-28 17:35:20 +00:00
CODE_OWNERS.TXT Add the list of code owners to the top level of the LLVM source tree to 2012-07-26 08:04:09 +00:00
configure Removing dependency on third party library for Intel JIT event support. 2012-09-28 17:35:20 +00:00
CREDITS.TXT Add IRC handle. 2012-09-11 07:50:40 +00:00
LICENSE.TXT Add YAML parser to Support. 2012-04-03 23:09:22 +00:00
llvm.spec.in
LLVMBuild.txt
Makefile Clear UNIVERSAL_SDK_PATH setting when building host tools. <rdar://12360497> 2012-09-24 22:51:19 +00:00
Makefile.common [docs] Remove unsupported references to ExtraSource variable. 2012-05-15 21:32:27 +00:00
Makefile.config.in Revert "Add --program-prefix support to build" 2012-09-26 00:01:00 +00:00
Makefile.rules Revert "Add --program-prefix support to build" 2012-09-26 00:01:00 +00:00
README.txt test commit 2012-07-11 17:34:12 +00:00

Low Level Virtual Machine (LLVM)
================================

This directory and its subdirectories contain source code for the Low Level
Virtual Machine, a toolkit for the construction of highly optimized compilers,
optimizers, and runtime environments.

LLVM is open source software. You may freely distribute it under the terms of
the license agreement found in LICENSE.txt.

Please see the HTML documentation provided in docs/index.html for further
assistance with LLVM.

If you're writing a package for LLVM, see docs/Packaging.html for our
suggestions.