llvm-mirror/lib/Analysis
Victor Hernandez 603a11de4e Fix bug where array malloc with unexpected computation of the size argument resulted in MallocHelper
identifying the malloc as a non-array malloc.  This broke GlobalOpt's optimization of stores of mallocs 
to global variables.

The fix is to classify malloc's into 3 categories:
1. non-array mallocs
2. array mallocs whose array size can be determined
3. mallocs that cannot be determined to be of type 1 or 2 and cannot be optimized

getMallocArraySize() returns NULL for category 3, and all users of this function must avoid their 
malloc optimization if this function returns NULL.

Eventually, currently unexpected codegen for computing the malloc's size argument will be supported in
isArrayMalloc() and getMallocArraySize(), extending malloc optimizations to those examples.

llvm-svn: 84199
2009-10-15 20:14:52 +00:00
..
IPA Extend the StartPassTimer and StopPassTimer functions so that the 2009-09-28 00:07:05 +00:00
AliasAnalysis.cpp Global Aliases are not identifiable objects. 2009-08-27 17:52:56 +00:00
AliasAnalysisCounter.cpp Do not try to override non-virtual methods, especially 2009-09-06 20:02:00 +00:00
AliasAnalysisEvaluator.cpp Fix a missing newline, now that Value's operator<< doesn't add one of its own. 2009-08-26 14:34:12 +00:00
AliasDebugger.cpp Refactor my previous change to maintain the distinction between AliasAnalysis and BasicAliasAnalysis. This involves some wider changes because it 2009-02-05 23:36:27 +00:00
AliasSetTracker.cpp eliminate the std::ostream form of WriteAsOperand and update clients. 2009-08-23 05:17:37 +00:00
Analysis.cpp Tidy #includes. 2009-08-11 16:02:12 +00:00
BasicAliasAnalysis.cpp Add missing break statements! Thanks to Duncan Sands for pointing this out! 2009-10-15 18:48:58 +00:00
CaptureTracking.cpp Push LLVMContexts through the IntegerType APIs. 2009-08-13 21:58:54 +00:00
CFGPrinter.cpp The flag "--dot-cfg-only" is at the moment equivalent to the flag "--dot-cfg". 2009-09-19 11:25:44 +00:00
CMakeLists.txt Update the other CMake file. 2009-10-13 18:50:54 +00:00
ConstantFolding.cpp Extend ConstantFolding to understand signed overflow variants 2009-10-05 22:53:52 +00:00
DbgInfoPrinter.cpp Remove std::string uses from DebugInfo interface. 2009-09-29 18:40:58 +00:00
DebugInfo.cpp "there is not any instruction with attached debug info in this module" does not mean "there is no debug info in this module". :) 2009-10-13 17:35:35 +00:00
InlineCost.cpp Compute a full cost value even when a setjmp call is found. 2009-10-13 20:10:10 +00:00
InstCount.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
Interval.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
IntervalPartition.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
IVUsers.cpp Instead of testing whether an instruction dominates the loop preheader, 2009-09-27 15:30:00 +00:00
LibCallAliasAnalysis.cpp LibCallAliasAnalysis doesn't use TargetData. 2009-07-31 20:56:29 +00:00
LibCallSemantics.cpp Remove Value::getNameLen 2009-07-26 08:34:35 +00:00
LiveValues.cpp Delete an obsolete sentance from a comment. 2009-05-31 16:18:57 +00:00
LoopDependenceAnalysis.cpp remove a few dead insertion methods. 2009-08-24 02:39:26 +00:00
LoopInfo.cpp Move the dominator verification code out of special code embedded within 2009-09-28 00:27:48 +00:00
LoopPass.cpp Fix this debug output to handle the case where the loop has been deleted. 2009-09-28 15:40:01 +00:00
Makefile Removed trailing whitespace from Makefiles. 2009-01-09 16:44:42 +00:00
MallocHelper.cpp Fix bug where array malloc with unexpected computation of the size argument resulted in MallocHelper 2009-10-15 20:14:52 +00:00
MemoryDependenceAnalysis.cpp Memory dependence analysis was incorrectly stopping to scan for stores to a pointer at bitcast uses of a malloc call. 2009-10-13 01:42:53 +00:00
PointerTracking.cpp Fix bug where array malloc with unexpected computation of the size argument resulted in MallocHelper 2009-10-15 20:14:52 +00:00
PostDominators.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
ProfileEstimatorPass.cpp Make ProfileEstimator even more robust on general CFGs. 2009-09-11 08:39:33 +00:00
ProfileInfo.cpp Add the first functions for updating ProfileInfo. 2009-09-09 17:52:57 +00:00
ProfileInfoLoader.cpp Reapplied r81355 with the problems fixed. 2009-09-16 11:35:50 +00:00
ProfileInfoLoaderPass.cpp Reapplied r81355 with the problems fixed. 2009-09-16 11:35:50 +00:00
ProfileVerifierPass.cpp Bugfix. Sorry. 2009-09-11 08:43:15 +00:00
README.txt Create a README.txt for lib/Analysis, and add an entry. 2009-09-28 18:38:53 +00:00
ScalarEvolution.cpp Revert r83606 and add comments explaining why it isn't safe. 2009-10-09 16:35:06 +00:00
ScalarEvolutionAliasAnalysis.cpp Add some comments. 2009-08-29 23:36:57 +00:00
ScalarEvolutionExpander.cpp Introduce and use convenience methods for getting pointer types 2009-10-06 15:40:36 +00:00
SparsePropagation.cpp Add a comment explaining why you would ever want to do this. 2009-09-19 19:00:06 +00:00
Trace.cpp eliminate the "Value" printing methods that print to a std::ostream. 2009-08-23 04:37:46 +00:00
ValueTracking.cpp Handle sqrt in CannotBeNegativeZero. absf and absl 2009-09-25 20:54:50 +00:00

Analysis Opportunities:

//===---------------------------------------------------------------------===//

In test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll, the
ScalarEvolution expression for %r is this:

  {1,+,3,+,2}<loop>

Outside the loop, this could be evaluated simply as (%n * %n), however
ScalarEvolution currently evaluates it as

  (-2 + (2 * (trunc i65 (((zext i64 (-2 + %n) to i65) * (zext i64 (-1 + %n) to i65)) /u 2) to i64)) + (3 * %n))

In addition to being much more complicated, it involves i65 arithmetic,
which is very inefficient when expanded into code.

//===---------------------------------------------------------------------===//