llvm-6502/lib/Transforms/Scalar
Chandler Carruth 81ff90db44 First major step toward addressing PR14059. This teaches SROA to handle
cases where we have partial integer loads and stores to an otherwise
promotable alloca to widen[1] those loads and stores to cover the entire
alloca and bitcast them into the appropriate type such that promotion
can proceed.

These partial loads and stores stem from an annoying confluence of ARM's
calling convention and ABI lowering and the FCA pre-splitting which
takes place in SROA. Clang lowers a { double, double } in-register
function argument as a [4 x i32] function argument to ensure it is
placed into integer 32-bit registers (a really unnerving implicit
contract between Clang and the ARM backend I would add). This results in
a FCA load of [4 x i32]* from the { double, double } alloca, and SROA
decomposes this into a sequence of i32 loads and stores. Inlining
proceeds, code gets folded, but at the end of the day, we still have i32
stores to the low and high halves of a double alloca. Widening these to
be i64 operations, and bitcasting them to double prior to loading or
storing allows promotion to proceed for these allocas.

I looked quite a bit changing the IR which Clang produces for this case
to be more friendly, but small changes seem unlikely to help. I think
the best representation we could use currently would be to pass 4 i32
arguments thereby avoiding any FCAs, but that would still require this
fix. It seems like it might eventually be nice to somehow encode the ABI
register selection choices outside of the parameter type system so that
the parameter can be a { double, double }, but the CC register
annotations indicate that this should be passed via 4 integer registers.

This patch does not address the second problem in PR14059, which is the
reverse: when a struct alloca is loaded as a *larger* single integer.

This patch also does not address some of the code quality issues with
the FCA-splitting. Those don't actually impede any optimizations really,
but they're on my list to clean up.

[1]: Pedantic footnote: for those concerned about memory model issues
here, this is safe. For the alloca to be promotable, it cannot escape or
have any use of its address that could allow these loads or stores to be
racing. Thus, widening is always safe.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165928 91177308-0d34-0410-b5e6-96231b3b80d8
2012-10-15 08:40:30 +00:00
..
ADCE.cpp
BasicBlockPlacement.cpp
CMakeLists.txt
CodeGenPrepare.cpp Remove the bitwise XOR operator from the Attributes class. Replace it with the equivalent from the builder class. 2012-10-14 06:56:13 +00:00
ConstantProp.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
CorrelatedValuePropagation.cpp CorrelatedPropagation: BasicBlock::removePredecessor can simplify PHI nodes. If the it's the condition of a SwitchInst, reload it. 2012-09-28 10:42:50 +00:00
DCE.cpp Make MemoryBuiltins aware of TargetLibraryInfo. 2012-08-29 15:32:21 +00:00
DeadStoreElimination.cpp Unquadratize SetVector removal loops in DSE. 2012-10-14 10:21:31 +00:00
EarlyCSE.cpp Update EarlyCSE's SimpleValues to use Hashing.h for their hashes. Expanded the hashing and equality to allow for equality modulo commutativity for binary ops, and comparisons with swapping of predicates. 2012-10-09 16:57:38 +00:00
GlobalMerge.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
GVN.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
IndVarSimplify.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
JumpThreading.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
LICM.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
LLVMBuild.txt
LoopDeletion.cpp
LoopIdiomRecognize.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
LoopInstSimplify.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
LoopRotation.cpp
LoopStrengthReduce.cpp Add a new interface to allow IR-level passes to access codegen-specific information. 2012-10-10 22:04:55 +00:00
LoopUnrollPass.cpp Create enums for the different attributes. 2012-10-09 07:45:08 +00:00
LoopUnswitch.cpp Create enums for the different attributes. 2012-10-09 07:45:08 +00:00
LowerAtomic.cpp
Makefile
MemCpyOptimizer.cpp Revert 165732 for further review. 2012-10-11 21:27:41 +00:00
ObjCARC.cpp Add an enum for the return and function indexes into the AttrListPtr object. This gets rid of some magic numbers. 2012-10-15 07:29:08 +00:00
Reassociate.cpp
Reg2Mem.cpp
Scalar.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
ScalarReplAggregates.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
SCCP.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
SimplifyCFGPass.cpp Move TargetData to DataLayout. 2012-10-08 16:38:25 +00:00
SimplifyLibCalls.cpp Attributes Rewrite 2012-10-15 04:46:55 +00:00
Sink.cpp
SROA.cpp First major step toward addressing PR14059. This teaches SROA to handle 2012-10-15 08:40:30 +00:00
TailRecursionElimination.cpp