llvm-6502/lib/Transforms/Scalar
Chris Lattner a92ff91a96 implement enough of the memset inference algorithm to recognize and insert
memsets.  This is still missing one important validity check, but this is enough
to compile stuff like this:

void test0(std::vector<char> &X) {
  for (std::vector<char>::iterator I = X.begin(), E = X.end(); I != E; ++I)
    *I = 0;
}

void test1(std::vector<int> &X) {
  for (long i = 0, e = X.size(); i != e; ++i)
    X[i] = 0x01010101;
}

With:
 $ clang t.cpp -S -o - -O2 -emit-llvm | opt -loop-idiom | opt -O3 | llc 

to:

__Z5test0RSt6vectorIcSaIcEE:            ## @_Z5test0RSt6vectorIcSaIcEE
## BB#0:                                ## %entry
	subq	$8, %rsp
	movq	(%rdi), %rax
	movq	8(%rdi), %rsi
	cmpq	%rsi, %rax
	je	LBB0_2
## BB#1:                                ## %bb.nph
	subq	%rax, %rsi
	movq	%rax, %rdi
	callq	___bzero
LBB0_2:                                 ## %for.end
	addq	$8, %rsp
	ret
...
__Z5test1RSt6vectorIiSaIiEE:            ## @_Z5test1RSt6vectorIiSaIiEE
## BB#0:                                ## %entry
	subq	$8, %rsp
	movq	(%rdi), %rax
	movq	8(%rdi), %rdx
	subq	%rax, %rdx
	cmpq	$4, %rdx
	jb	LBB1_2
## BB#1:                                ## %for.body.preheader
	andq	$-4, %rdx
	movl	$1, %esi
	movq	%rax, %rdi
	callq	_memset
LBB1_2:                                 ## %for.end
	addq	$8, %rsp
	ret



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122573 91177308-0d34-0410-b5e6-96231b3b80d8
2010-12-26 23:42:51 +00:00
..
ADCE.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
BasicBlockPlacement.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
CMakeLists.txt Start of a pass for recognizing memset and memcpy idioms. 2010-12-26 19:32:44 +00:00
CodeGenPrepare.cpp It is possible for SimplifyCFG to cause PHI nodes to become redundant too late in the optimization 2010-12-23 20:57:35 +00:00
ConstantProp.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
CorrelatedValuePropagation.cpp Fix PR8790, another instance where unreachable code can cause instruction simplification to fail, 2010-12-15 00:55:35 +00:00
DCE.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
DeadStoreElimination.cpp Move Value::getUnderlyingObject to be a standalone 2010-12-15 20:02:24 +00:00
GEPSplitter.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
GVN.cpp Give GVN back the ability to perform simple conditional propagation on conditional branch values. 2010-12-21 23:54:34 +00:00
IndVarSimplify.cpp Move SCEV::isLoopInvariant and hasComputableLoopEvolution to be member 2010-11-17 21:23:15 +00:00
JumpThreading.cpp Fix a bug in the loop in JumpThreading::ProcessThreadableEdges() where it could falsely produce a MultipleDestSentinel value if the first predecessor ended with an 'indirectbr'. If that happened, it caused an unnecessary FindMostPopularDest() call. 2010-12-16 12:16:00 +00:00
LICM.cpp Enhance LICM to promote alias sets whose pointers themselves are stored, 2010-12-19 05:57:25 +00:00
LoopDeletion.cpp Passes do not need to recursively initialize passes that they preserve, if 2010-10-19 20:08:44 +00:00
LoopIdiomRecognize.cpp implement enough of the memset inference algorithm to recognize and insert 2010-12-26 23:42:51 +00:00
LoopRotation.cpp Passes do not need to recursively initialize passes that they preserve, if 2010-10-19 20:08:44 +00:00
LoopStrengthReduce.cpp Move SCEV::dominates and properlyDominates to ScalarEvolution. 2010-11-17 21:41:58 +00:00
LoopUnrollPass.cpp Passes do not need to recursively initialize passes that they preserve, if 2010-10-19 20:08:44 +00:00
LoopUnswitch.cpp Constant folding here is pointless, because InstructionSimplify 2010-11-23 20:24:21 +00:00
LowerAtomic.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
Makefile make -fno-rtti the default unless a directory builds with REQUIRES_RTTI. 2010-01-24 20:43:08 +00:00
MemCpyOptimizer.cpp start using irbuilder to make mem intrinsics in a few passes. 2010-12-26 22:57:41 +00:00
Reassociate.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
Reg2Mem.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
Scalar.cpp Start of a pass for recognizing memset and memcpy idioms. 2010-12-26 19:32:44 +00:00
ScalarReplAggregates.cpp start using irbuilder to make mem intrinsics in a few passes. 2010-12-26 22:57:41 +00:00
SCCP.cpp Avoid exponential growth of a table. It feels like 2010-11-30 20:23:21 +00:00
SimplifyCFGPass.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
SimplifyHalfPowrLibCalls.cpp Get rid of static constructors for pass registration. Instead, every pass exposes an initializeMyPassFunction(), which 2010-10-19 17:21:58 +00:00
SimplifyLibCalls.cpp Revert r64460. strtol and friends cannot be marked readonly, even with 2010-12-17 01:09:43 +00:00
Sink.cpp Add helper functions for computing the Location of load, store, 2010-11-11 21:50:19 +00:00
TailDuplication.cpp Replace calls to ConstantFoldInstruction with calls to SimplifyInstruction 2010-11-23 20:26:33 +00:00
TailRecursionElimination.cpp Have a few places that want to simplify phi nodes use SimplifyInstruction 2010-11-16 17:41:24 +00:00