1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 11:33:24 +02:00
Commit Graph

2289 Commits

Author SHA1 Message Date
Chris Lattner
3fec0954e8 Changes to work with Statistics rework
* Renamed StatisticReporter.h/cpp to Statistic.h/cpp
    * Broke constructor to take two const char * arguments instead of one, so
      that indendation can be taken care of automatically.
    * Sort the list by pass name when printing
    * Make sure to print all statistics as a group, instead of randomly when
      the statistics dtors are called.
    * Updated ProgrammersManual with new semantics.

llvm-svn: 4004
2002-10-01 22:40:31 +00:00
Chris Lattner
7cf9f6f4b1 Updates to work with recent Statistic's changes:
* Renamed StatisticReporter.h/cpp to Statistic.h/cpp
    * Broke constructor to take two const char * arguments instead of one, so
      that indendation can be taken care of automatically.
    * Sort the list by pass name when printing
    * Make sure to print all statistics as a group, instead of randomly when
      the statistics dtors are called.
    * Updated ProgrammersManual with new semantics.

llvm-svn: 4002
2002-10-01 22:38:41 +00:00
Chris Lattner
4cc183889f Updates to work with recent Statistic's changes:
* Renamed StatisticReporter.h/cpp to Statistic.h/cpp
    * Broke constructor to take two const char * arguments instead of one, so
      that indendation can be taken care of automatically.
    * Sort the list by pass name when printing
    * Make sure to print all statistics as a group, instead of randomly when
      the statistics dtors are called.
    * Updated ProgrammersManual with new semantics.

llvm-svn: 4001
2002-10-01 22:38:37 +00:00
Chris Lattner
b5d3e33496 Build subdirs in parallel
llvm-svn: 4000
2002-10-01 22:36:35 +00:00
Chris Lattner
c2322d5fac - Rework Statistics:
* Renamed StatisticReporter.h/cpp to Statistic.h/cpp
    * Broke constructor to take two const char * arguments instead of one, so
      that indendation can be taken care of automatically.
    * Sort the list by pass name when printing
    * Make sure to print all statistics as a group, instead of randomly when
      the statistics dtors are called.

llvm-svn: 3999
2002-10-01 22:35:45 +00:00
Chris Lattner
9fc451723d Initial checkin of Steensgaards context insensitive flow insensitive
alias analysis

llvm-svn: 3997
2002-10-01 22:34:12 +00:00
Chris Lattner
c1b7de86d5 Checkin some major reworks of data structure analysis. This is not done,
nor does it work very well, but I need to get it checked in before I break
the tree unintentionally.

llvm-svn: 3996
2002-10-01 22:33:50 +00:00
Chris Lattner
9a8022871b Make sure to use the TimerGroup that we created!
llvm-svn: 3995
2002-10-01 20:12:06 +00:00
Chris Lattner
10fd9ad81e Make sure not to count the PassManager wrapers
llvm-svn: 3994
2002-10-01 20:08:11 +00:00
Chris Lattner
b7a507eb31 Factor timer code out of PassManager implementation, into a generic interface
exposed by Support/Timer.h.

llvm-svn: 3993
2002-10-01 19:54:07 +00:00
Chris Lattner
9b38808792 Checkin generic interval timer support
llvm-svn: 3992
2002-10-01 19:36:54 +00:00
Nick Hildenbrandt
1defd8270c Fixed to properly escape quotes in strings.
llvm-svn: 3991
2002-09-30 21:11:55 +00:00
Chris Lattner
53be50fb2f Minor tweak
llvm-svn: 3985
2002-09-29 22:59:29 +00:00
Vikram S. Adve
01e64b5eef Bug fix in folding getElementPtr instructions: don't fold one into
a predecessor if it has a non-zero first index and the predecessor
ends with a struct index.

llvm-svn: 3982
2002-09-29 22:55:05 +00:00
Chris Lattner
e3eaa16375 Fix a problem that was caused by stale analyses being in CurrentAnalyses
llvm-svn: 3981
2002-09-29 22:50:22 +00:00
Chris Lattner
61e8de1c61 Fix bug in LICM that caused the previous big win. :(
llvm-svn: 3980
2002-09-29 22:26:07 +00:00
Chris Lattner
ef0e95bb42 Hoist the contents of Loops in depth first order in the dominator tree,
rather than in random order.  This causes LICM to be DRAMATICALLY more
effective. For example, on bzip2.c, it is able to hoist 302 loads and
2380 total instructions, as opposed to 44/338 before.  This  obviously
makes other transformations much more powerful as well!

llvm-svn: 3978
2002-09-29 21:46:09 +00:00
Chris Lattner
45c83d6451 Fix printing of loop information
llvm-svn: 3977
2002-09-29 21:43:04 +00:00
Chris Lattner
2a7dd8373f Improve printing of dominator sets
llvm-svn: 3976
2002-09-29 21:42:42 +00:00
Chris Lattner
b731880895 Fix major bugs in dominator set & tree information updating
llvm-svn: 3975
2002-09-29 21:41:38 +00:00
Vikram S. Adve
69d19cf9a9 Convert DIRS to PARALLEL_DIRS. They can be built independently.
llvm-svn: 3972
2002-09-29 11:52:14 +00:00
Vikram S. Adve
59778ef96d Added a couple of helper methods for live range construction.
llvm-svn: 3970
2002-09-28 17:05:43 +00:00
Vikram S. Adve
2710051771 Live ranges for Return value and return address of a Call are now
created here, simply by handling all implicit operands (which should
have been done anyway).

llvm-svn: 3969
2002-09-28 17:05:22 +00:00
Vikram S. Adve
7e39b876eb Fixed method getReturnValue(): it should return NULL if the
callee does not return a value.

llvm-svn: 3968
2002-09-28 17:03:54 +00:00
Vikram S. Adve
7c0175962a Fixed incorrect assertion: spill code for function ptr should be
handled like normal operands, not like other call arguments.

llvm-svn: 3967
2002-09-28 17:02:40 +00:00
Vikram S. Adve
eb6d37c32b Return address register should be marked as "result" for the JMPL instruction
since it is defined by the instruction.

llvm-svn: 3966
2002-09-28 17:00:15 +00:00
Vikram S. Adve
06742cc0e0 Live ranges for Return value and return address of a Call are no longer
created here.  Instead they are created in LiveRangeInfo.cpp.  This
simplifies the code here quite a bit.

llvm-svn: 3965
2002-09-28 16:59:05 +00:00
Vikram S. Adve
1aed35b2e5 Simplified code that handles call args and rets, so it no longer
needs the RegClass list to be passed in.

llvm-svn: 3964
2002-09-28 16:56:59 +00:00
Vikram S. Adve
33b21ec523 Simplify Call translation slightly.
llvm-svn: 3963
2002-09-28 16:55:41 +00:00
Vikram S. Adve
940f3fa91b Overhaul integer conversions to match C++ ISO standard.
Don't allow direct FP-to-uint conversion (must be eliminated by preselection).
Address arithmetic for arrays is now entirely 64-bit so no sign-ext needed.

llvm-svn: 3961
2002-09-27 14:33:08 +00:00
Vikram S. Adve
ae0af2a164 Modify operand order for Create{Sign,Zero}ExtensionInstructions.
llvm-svn: 3960
2002-09-27 14:29:45 +00:00
Vikram S. Adve
2a87b4496f Bug fix: some redundant copies were not being deleted after detection :-|.
llvm-svn: 3959
2002-09-27 14:27:37 +00:00
Vikram S. Adve
c795b90eac Sign-extend integer constants from original type size to 64 bits!
llvm-svn: 3958
2002-09-27 14:26:20 +00:00
Vikram S. Adve
6cff79b3e1 Decompose FP-to-UInt casts into FP-to-ULong-toUInt.
llvm-svn: 3957
2002-09-27 14:24:45 +00:00
Chris Lattner
a9bc408104 First try at implementing the AliasSetTracker class. I'm sure it will need
revision as I start to use it though.

llvm-svn: 3954
2002-09-26 21:49:07 +00:00
Chris Lattner
0bbb8f6e06 - Further cleanups of LICM pass, remove extra work from previous implementation
- Do not clone instructions then insert clone outside of loop.  Just move them.

llvm-svn: 3951
2002-09-26 19:40:25 +00:00
Chris Lattner
0c66734ac5 Improve comments, doxygenize more
llvm-svn: 3950
2002-09-26 16:52:07 +00:00
Chris Lattner
21eb78d59d Clean up LICM significantly now that it is guaranteed to have loop preheaders
llvm-svn: 3947
2002-09-26 16:38:03 +00:00
Chris Lattner
9cdbd428b0 Change pass name to something sane
llvm-svn: 3946
2002-09-26 16:37:37 +00:00
Chris Lattner
fe9fba6f5b Loop invariant code motion now depends on the LoopPreheader pass. Dead code
has not yet been removed.

llvm-svn: 3945
2002-09-26 16:19:31 +00:00
Chris Lattner
f9676d651d - Cleanup break-crit-edges pass by making SplitCriticalEdge a member method.
- break-crit-edges pass does not invalidate loop-preheader pass.

llvm-svn: 3944
2002-09-26 16:18:51 +00:00
Chris Lattner
e5996b4c88 Checkin new loop-preheader insertion pass.
llvm-svn: 3942
2002-09-26 16:17:31 +00:00
Chris Lattner
8b97a81265 Fix printing of loop information
llvm-svn: 3941
2002-09-26 16:15:54 +00:00
Chris Lattner
8752bb1cfc - Add methods to ImmediateDominators & DominatorTree to allow updates
- Make DominatorTree::Node not inherit from std::vector

llvm-svn: 3939
2002-09-26 16:14:41 +00:00
Chris Lattner
bfa0786c7e - Add new methods to LoopInfo: getLoopPreheader, addBasicBlockToLoop.
These allow extra information to be easily gathered, and loopinfo to be
    updated.

llvm-svn: 3936
2002-09-26 05:32:50 +00:00
Chris Lattner
989b743c33 - Add new ctor to BasicBlock to allow insertion before any BB, not just at
the end of the function.

llvm-svn: 3934
2002-09-26 05:03:22 +00:00
Chris Lattner
7cdd2e0cb0 Converted SimpleStructMutation to take TargetData as a required pass.
llvm-svn: 3932
2002-09-26 00:17:21 +00:00
Chris Lattner
7ab2bba3d3 Change LowerAllocations pass to 'require' TargetData instead of it being
passed in.

llvm-svn: 3929
2002-09-25 23:47:47 +00:00
Chris Lattner
0f9d9214ab Convert TargetData to be an ImmutablePass
llvm-svn: 3927
2002-09-25 23:46:55 +00:00
Chris Lattner
04af33fe09 Convert BasicVN to be an ImmutablePass
llvm-svn: 3924
2002-09-25 22:27:25 +00:00
Chris Lattner
37ae98efd1 * Fix ugly bug in previous checkin where I reused the name 'i' one too many times
* Print out immutable passes in the -debug-pass=Structure report.

llvm-svn: 3923
2002-09-25 22:26:52 +00:00
Chris Lattner
e7d8ee84e7 Add support for ImmutablePasses, which are not run, and cannot be
invalidated.

llvm-svn: 3921
2002-09-25 21:59:11 +00:00
Nick Hildenbrandt
205d6a6b20 Strings now handled correctly.
llvm-svn: 3920
2002-09-25 20:29:26 +00:00
Chris Lattner
2cf19d980a - Fix bug: Mem2Reg/2002-05-01-ShouldNotPromoteThisAlloca.ll
llvm-svn: 3917
2002-09-24 21:19:41 +00:00
Chris Lattner
7fafece8e0 Eliminate extraneous #include
llvm-svn: 3916
2002-09-24 21:18:40 +00:00
Chris Lattner
54cf78c786 Fix bug: SimplifyCFG/2002-09-24-PHIAssertion.ll
llvm-svn: 3913
2002-09-24 16:09:17 +00:00
Chris Lattner
a4f47fb77e - Do not expose Critical Edge breaking mechanics outside the BCE pass, thus
removing it from Transforms/Local.h and from Transforms/Utils/*

llvm-svn: 3911
2002-09-24 15:52:01 +00:00
Chris Lattner
25ba5ac7ce - Do not expose Critical Edge breaking mechanics outside the BCE pass, thus
removing it from Transforms/Local.h and from Transforms/Utils/*

llvm-svn: 3910
2002-09-24 15:51:56 +00:00
Chris Lattner
1014aae962 Correlated Exprs pass now requires BCE pass instead of doing it manually
llvm-svn: 3908
2002-09-24 15:43:56 +00:00
Chris Lattner
49588769e0 - Expose passinfo from BreakCriticalEdges pass so that it may be "Required"
by other passes.  Make BCE pass be in anonymous namespace now.

llvm-svn: 3907
2002-09-24 15:43:12 +00:00
Chris Lattner
4e11d9e5de Minor cleanups
llvm-svn: 3904
2002-09-24 00:09:26 +00:00
Chris Lattner
e62cdff96c Add new BreakCriticalEdges pass
llvm-svn: 3903
2002-09-24 00:08:39 +00:00
Chris Lattner
34d9c4ec10 Make users of FindUsedTypes not have problems with linkage. This fixes
Cwriter.

llvm-svn: 3900
2002-09-24 00:07:21 +00:00
Chris Lattner
b6c408778a Optimize away cases like:
%cast109 = cast uint %cast212 to short          ; <short> [#uses=1]
        %cast214 = cast short %cast109 to uint          ; <uint> [#uses=1]
        %cast215 = cast uint %cast214 to short          ; <short> [#uses=1]

llvm-svn: 3897
2002-09-23 23:39:43 +00:00
Chris Lattner
a4184f9ab6 Fix: ConstantMerge/2002-09-23-CPR-Update.ll
Basically, this bug boiled down to calling replaceUsesOfWith on a constant,
which changed it's shape in an illegal way.  This pass now goes through all
of the trouble neccesary to do the replacement on constants.

llvm-svn: 3895
2002-09-23 23:00:46 +00:00
Nick Hildenbrandt
cb0b25c6c1 Parenthesis are now added to casts of type array.
llvm-svn: 3892
2002-09-23 21:02:50 +00:00
Chris Lattner
2a53929c5d * Fix bug: CorrelatedExprs/2002-09-23-PHIUpdateBug.ll
* Make sure "Changed" is updated correctly

llvm-svn: 3891
2002-09-23 20:06:22 +00:00
Chris Lattner
aecb825629 Insert resolved constants into the global map so they are reused correctly.
This bug was exposed linking the SPEC benchmark suite.

llvm-svn: 3888
2002-09-23 18:14:15 +00:00
Vikram S. Adve
a7e73bb0a0 Put intermediate source files in a subdirectory here instead of with
object files.  Also,

llvm-svn: 3884
2002-09-23 13:12:28 +00:00
Vikram S. Adve
20fc3f0ffd Disable reassociation pass in LLC until it is fixed.
llvm-svn: 3883
2002-09-23 12:55:50 +00:00
Chris Lattner
5c6d487ee2 Don't insert a PHI node to merge "returns" from an inlined function if there
is only a single return from the function!

llvm-svn: 3878
2002-09-22 18:41:25 +00:00
Anand Shukla
a34898d9ac Changed codegen to add 2 empty slots at the top of stack using StackSlots pass
llvm-svn: 3873
2002-09-21 05:01:21 +00:00
Anand Shukla
508121e5d9 Initial version: it adds 2 empty slots at the top of stack
llvm-svn: 3872
2002-09-21 04:58:26 +00:00
Chris Lattner
b9379750d9 Fix cwriter to not output FP constants in ascii, output them in hex instead.
This fixes a number of FP precision problems, making the output of the
power benchmark closer to the right answer.

Unfortunately, this only addresses FP constants used directly in functions.
Constants referred to by global constants (such as an array of FP values)
aren't helped by this.  Until this happens power won't work.

llvm-svn: 3871
2002-09-20 23:26:33 +00:00
Chris Lattner
6874ea0917 Fix bug: 2002-09-20-VarArgPrototypes.ll
llvm-svn: 3870
2002-09-20 22:32:30 +00:00
Anand Shukla
da24f223d3 Changed uchar to unsigned char in function ParseBytecodeBuffer, because seemingly it affects opt in uncertain ways :)
llvm-svn: 3866
2002-09-20 20:57:54 +00:00
Anand Shukla
b959e8559e Added checking threshold
llvm-svn: 3864
2002-09-20 16:44:35 +00:00
Chris Lattner
0752044e03 Fix output of typedefs to avoid syntax errors.
* We now can correctly Cify the Olden-power benchmark

llvm-svn: 3860
2002-09-20 15:20:24 +00:00
Chris Lattner
1c1de51dfe * Add a couple of comments to the output c code
* _FIX_ infinite recursion problem, due to typedefs of a structure being
  printed before the structure.

llvm-svn: 3859
2002-09-20 15:18:30 +00:00
Chris Lattner
af6a9e8fc4 Another change that doesn't affect functionality. Since we are only looking
at types in the symbol table, only traverse the type plane, saving a loop nest.

llvm-svn: 3858
2002-09-20 15:12:13 +00:00
Chris Lattner
a66eef584f Make the StructPrinted set only take memory when it's being used.
rename parseStruct to printContainedStructs

llvm-svn: 3857
2002-09-20 15:05:40 +00:00
Chris Lattner
4f385b19bb No functionality changes, primarily just changing tab indentation to space
indentation

llvm-svn: 3856
2002-09-20 14:56:54 +00:00
Vikram S. Adve
07a33b5553 Add method IGNode::getCombinedDegree to count the sum of the degrees
of two nodes, excluding duplicates.

llvm-svn: 3848
2002-09-20 00:55:04 +00:00
Vikram S. Adve
1d139cf8de Add PostOpts/ and rename PreSelection/ to PreOpts/.
llvm-svn: 3847
2002-09-20 00:53:53 +00:00
Vikram S. Adve
bcab1ae6c9 Add peephole optimization pass at the end of code generation.
llvm-svn: 3846
2002-09-20 00:52:43 +00:00
Vikram S. Adve
ed466a713a Added class MachineOptInfo as interface to target-specific
routines supporting machine code optimization.
Also added method MachineInstrInfo::getNOPOpCode().

llvm-svn: 3845
2002-09-20 00:52:09 +00:00
Vikram S. Adve
47303cde2d Add method MachineInstr::replace to rewrite a machine instruction in place.
llvm-svn: 3843
2002-09-20 00:47:49 +00:00
Vikram S. Adve
ccb33335a3 Allow copy coalescing in more cases: if sum of node degrees is more than
than #available regs, compute the sum excluding duplicates and if that
is less than #regs, go ahead and coalesce.
Add method IGNode::getCombinedDegree to count excluding duplicates.

llvm-svn: 3842
2002-09-20 00:45:47 +00:00
Vikram S. Adve
82b15d7253 Peephole optimization pass on final machine code.
llvm-svn: 3840
2002-09-20 00:42:11 +00:00
Vikram S. Adve
8dc14ec198 Files moved to CodeGen/PreOpts.
llvm-svn: 3839
2002-09-20 00:30:46 +00:00
Vikram S. Adve
6f0ad9998b Moving these files from Code/PreSelection to here.
Original logs for PreSelection.cpp:

  revision 1.2
  date: 2002/09/17 23:50:32;  author: lattner;  state: Exp;  lines: +1 -3
  Don't put default parameter values into .cpp files, it breaks 3.x compilers

  revision 1.1
  date: 2002/09/16 15:31:13;  author: vadve;  state: Exp;
  New preselection pass that specializes LLVM code for a target machine,
  while remaining in legal portable LLVM form and preserving type
  information and type safety.

llvm-svn: 3838
2002-09-20 00:29:28 +00:00
Chris Lattner
39614ed129 Add an optimization to support the most common access pattern for the
library.  This speeds debug builds up significantly.

llvm-svn: 3826
2002-09-19 19:22:11 +00:00
Chris Lattner
c86c7ecdb5 Make sure that we abort if an error happens as early as neccesary. Before
it was possible for the passmanager to continue running passes after the
verifier even if the module was not well formed.

llvm-svn: 3820
2002-09-19 16:12:19 +00:00
Anand Shukla
cf6e76fbff split retracing into a separate file
llvm-svn: 3809
2002-09-18 03:55:26 +00:00
Chris Lattner
ee9b6ce5c7 Compile sub-directories in parallel, because they don't have interdependencies
llvm-svn: 3808
2002-09-18 03:25:58 +00:00
Misha Brukman
e093f5cb9b Removed unnecessary #includes.
llvm-svn: 3802
2002-09-18 02:07:57 +00:00
Misha Brukman
6a2dc6b0ba Fixed typo.
llvm-svn: 3801
2002-09-18 00:42:45 +00:00
Chris Lattner
86e6e0f6e3 Don't put default parameter values into .cpp files, it breaks 3.x compilers
llvm-svn: 3799
2002-09-17 23:50:32 +00:00
Chris Lattner
4396aee3a2 There is a #define in some header that conflicts with INFINITY, rename it.
llvm-svn: 3797
2002-09-17 23:46:33 +00:00
Chris Lattner
5ccb21f41d Fix bug: test/Regression/Transforms/InstCombine/2002-09-17-GetElementPtrCrash.ll
Thanks to Casey for finding it!

llvm-svn: 3783
2002-09-17 21:05:42 +00:00
Anand Shukla
4a62f43843 Removed debug info printing
llvm-svn: 3778
2002-09-17 20:24:46 +00:00
Chris Lattner
7c1b7e5889 Add support for GCC 2.96
llvm-svn: 3777
2002-09-17 17:23:09 +00:00
Vikram S. Adve
fa9dd5dba9 Don't print global variable definitions twice! Sun's pathetic compiler
never complained about this.

llvm-svn: 3774
2002-09-17 11:50:38 +00:00
Vikram S. Adve
ee3caccf5c Remove specification of argument default from cpp file.
llvm-svn: 3772
2002-09-17 01:17:57 +00:00
Chris Lattner
99d6a46698 Fix FunctionInlining pass assertion failure:
ilist:104: failed assertion `Traits::getNext(NodePtr) != 0 && "Dereferencing end()!"'

llvm-svn: 3768
2002-09-16 22:30:20 +00:00
Chris Lattner
5704e40ce0 Fix: test/Regression/LLC/badidx.c problem
llvm-svn: 3763
2002-09-16 18:32:33 +00:00
Vikram S. Adve
4bcec53ed7 Extract most of the transformation into an externally accessible
function -- DecomposeArrayRef(GetElementPtrInst* GEP) -- that can
be invoked on a single instruction at a time.

llvm-svn: 3755
2002-09-16 16:40:07 +00:00
Vikram S. Adve
d43591bbc5 Use ulong instead of uint for size expressions.
llvm-svn: 3744
2002-09-16 15:56:45 +00:00
Vikram S. Adve
59b3b6c07b Add methods to query about the representation of LLVM quantities (e.g.,
constants).  Useful for target-dependent LLVM transformations like
Preselection.

llvm-svn: 3743
2002-09-16 15:56:01 +00:00
Vikram S. Adve
571ad069cc Don't print out global names unnecesssarily. Also, expose pass
constructors so passes can be inserted by TargetMachine.cpp.

llvm-svn: 3742
2002-09-16 15:54:02 +00:00
Vikram S. Adve
58678cc06e Move all the code that creates code generation passes from Sparc.cpp to
TargetMachine.cpp, since it is entirely machine-independent.
Also, add options to disable optional back-end passes (preselection and
instr. scheduling).

llvm-svn: 3740
2002-09-16 15:39:26 +00:00
Vikram S. Adve
04cace44d8 Add subdirectory PreSelection.
llvm-svn: 3739
2002-09-16 15:32:07 +00:00
Vikram S. Adve
a5b251ed67 New preselection pass that specializes LLVM code for a target machine,
while remaining in legal portable LLVM form and preserving type
information and type safety.

llvm-svn: 3738
2002-09-16 15:31:13 +00:00
Vikram S. Adve
3d9c3e8751 Dump routine now writes out allocated register numbers if available.
llvm-svn: 3737
2002-09-16 15:18:53 +00:00
Vikram S. Adve
df1e95af82 Improve and fix error in allocating stack slots: adjust alignment after adding
base address of the relevant region (instead of assuming that each region
is maximally aligned).

llvm-svn: 3736
2002-09-16 15:18:16 +00:00
Vikram S. Adve
533c888d4a Add a version of ChooseRegOrImmed to handle numerical constants
introduced by InstrSelection.

llvm-svn: 3735
2002-09-16 15:15:57 +00:00
Vikram S. Adve
74823d9145 Add an assertion.
llvm-svn: 3734
2002-09-16 15:13:59 +00:00
Anand Shukla
86e49b7621 Incorporated changes in alloca and getElementPointer instruction
llvm-svn: 3733
2002-09-16 05:26:51 +00:00
Anand Shukla
0906acb26d Incorporated changes in alloca instruction
llvm-svn: 3732
2002-09-16 05:24:49 +00:00
Vikram S. Adve
012667a925 No longer need to sign-extend array indices to 64 bits since they
are now longs and not unsigned ints.

llvm-svn: 3731
2002-09-15 21:51:04 +00:00
Vikram S. Adve
69cf056052 Fix typos in previous checkin.
llvm-svn: 3726
2002-09-15 15:33:48 +00:00
Chris Lattner
db2c0b75ab RegAllocCommon no longer includes CommandLine.h so we have to include it
here.

llvm-svn: 3725
2002-09-15 07:07:55 +00:00
Vikram S. Adve
2ebafaf8ff Break RA_DEBUG option into several levels to get better control over
debug output.

llvm-svn: 3724
2002-09-14 23:05:33 +00:00
Vikram S. Adve
8d2a9260ef Remove unnecessary include.
llvm-svn: 3723
2002-09-14 23:04:52 +00:00
Vikram S. Adve
263de0387d Break RA_DEBUG option into several levels to get better output.
llvm-svn: 3722
2002-09-14 22:18:37 +00:00
Nick Hildenbrandt
da4f9b1cee Fixed problem with printing struct definitions in the correct order.
This allows for the Regression/Transforms/ScalarReplacement/scalarize.c to run correctly.

llvm-svn: 3721
2002-09-14 21:36:24 +00:00
Chris Lattner
56d9dfd0e0 Fix bug I introduced
llvm-svn: 3719
2002-09-14 19:33:16 +00:00
Vikram S. Adve
7cad54b354 Moving to lib/CodeGen/RegAlloc.
llvm-svn: 3718
2002-09-14 11:57:17 +00:00
Misha Brukman
2e598f0092 Function.h is unnecessary when Module.h is included.
llvm-svn: 3716
2002-09-14 03:04:02 +00:00
Misha Brukman
ab67f309cd On the quest of eliminating unnecessary includes.
llvm-svn: 3715
2002-09-14 02:18:57 +00:00
Misha Brukman
9e054e1d17 Again, including Module makes Function unnecessary.
llvm-svn: 3714
2002-09-14 02:07:43 +00:00
Misha Brukman
dbe90c56ec Following Chris's advice, I'm pruning some unnecessary .h includes that I'm
noticing. Since Module includes Function, and eventually, BasicBlock and
GlobalVariable, the last three are unnecessary to be included directly.

llvm-svn: 3713
2002-09-14 02:06:53 +00:00
Chris Lattner
7de3aaa26f * Fix a bug that was causing lli to misrun:
test/Regression/Transforms/DecomposeMultiDimRefs/mixedindices.c
* Eliminate unneccesary #include

llvm-svn: 3712
2002-09-13 23:30:42 +00:00
Chris Lattner
547be87c13 Change the MallocInst & AllocaInst ctors to take the allocated type, not the
pointer type returned.

llvm-svn: 3711
2002-09-13 22:28:50 +00:00
Chris Lattner
f820cab2ad Change the MallocInst & AllocaInst ctors to take the allocated type, not the
pointer type returned.

llvm-svn: 3710
2002-09-13 22:28:45 +00:00
Chris Lattner
55457ada73 include/llvm/DataTypes.h includes this #define so we don't need it anymore
llvm-svn: 3709
2002-09-13 22:25:00 +00:00
Chris Lattner
ad291457ef include/llvm/DataTypes.h includes this #define so we don't need it anymore
llvm-svn: 3708
2002-09-13 22:24:57 +00:00
Chris Lattner
7fa7135b32 Export symbols for linux
llvm-svn: 3707
2002-09-13 22:20:19 +00:00
Chris Lattner
73f4e09752 Submitted by Casey Carter:
ISSUE: Linux doesn't have any steenking SIGEMT signal, as referred to in
lib/Support/Signals.cpp.

ACTION: Wrap the use with a #ifdef SIGEMT / #endif.
llvm-svn: 3700
2002-09-13 14:57:24 +00:00
Chris Lattner
dfd0d44c99 Another portability fix provided via Casey Carter:
ISSUE: getTimeRecord in lib/VMCore/Pass.cpp uses timeval and
gettimeofday() without including sys/time.h.

ACTION: Include sys/time.h.
llvm-svn: 3699
2002-09-13 14:47:12 +00:00
Chris Lattner
c96a7a51bf Another portability patch graciously provided by Casey Carter
llvm-svn: 3698
2002-09-13 14:41:38 +00:00
Chris Lattner
5f8c0401a9 Fix a bug introduced by the Getelementptr change
llvm-svn: 3695
2002-09-12 20:34:47 +00:00
Chris Lattner
23bd92aeeb Fix a bug I introduced into the code generator. :(
llvm-svn: 3694
2002-09-12 20:27:10 +00:00
Chris Lattner
d6fed79df6 Fix bug I introduced with one of my previous changes.
Thanks fly out to Nick for noticing it!  :)

llvm-svn: 3691
2002-09-12 19:00:43 +00:00
Chris Lattner
9b5fa33b42 Add a new BasicBlockPass::doInitialization/Finalization(Function &) pair of
methods that may be useful for BasicBlockPasses.

llvm-svn: 3688
2002-09-12 17:06:40 +00:00
Chris Lattner
cb973bf5ee - Change getelementptr instruction to use long indexes instead of uint
indexes for sequential types.

llvm-svn: 3683
2002-09-11 01:21:35 +00:00
Chris Lattner
fb017cb38c - Change getelementptr instruction to use long indexes instead of uint
indexes for sequential types.

llvm-svn: 3682
2002-09-11 01:21:33 +00:00
Chris Lattner
18e3c4ff50 - Change getelementptr instruction to use long indexes instead of uint
indexes for sequential types.

llvm-svn: 3681
2002-09-11 01:21:29 +00:00
Chris Lattner
596aa597a6 Give better assertion message for error conditions
llvm-svn: 3680
2002-09-11 01:21:04 +00:00
Chris Lattner
a8e481b961 Recently changed getelementptr to use 'long' indexes for sequential types
instead of uints.  This adds a translation scheme to be backwards compatible
with old .ll files.

llvm-svn: 3679
2002-09-11 01:17:27 +00:00
Chris Lattner
1a91b112b7 Allocation insts always have one operand
llvm-svn: 3677
2002-09-11 00:22:39 +00:00
Chris Lattner
c882973bf7 Add convenience ctor to BranchInst
llvm-svn: 3676
2002-09-10 23:54:58 +00:00
Chris Lattner
5f4b79edaf Fix the last of the silly bugs I just introduced. :(
llvm-svn: 3674
2002-09-10 23:46:10 +00:00
Chris Lattner
62bd3a248c Fix bugs in previous checkins
llvm-svn: 3673
2002-09-10 23:31:28 +00:00
Chris Lattner
0b81131afc Fix bug in previous checkin
llvm-svn: 3672
2002-09-10 23:31:12 +00:00
Chris Lattner
5143d4a3b3 Add cannonicalization of shl X, 1 -> add X, X
llvm-svn: 3671
2002-09-10 23:04:09 +00:00
Chris Lattner
f2fa52fec2 Fix minor problems in previous checkin
llvm-svn: 3669
2002-09-10 22:52:51 +00:00
Chris Lattner
3b3e26bb63 Fix minor problems in previous checkin
llvm-svn: 3668
2002-09-10 22:52:49 +00:00
Chris Lattner
f2e4e61769 Clean up code due to auto-insert constructors
llvm-svn: 3666
2002-09-10 22:38:49 +00:00
Chris Lattner
37c3a1d80c Clean up code due to auto-insert constructors
llvm-svn: 3665
2002-09-10 22:38:47 +00:00
Chris Lattner
38203aa15a Clean up code
llvm-svn: 3664
2002-09-10 22:38:06 +00:00
Chris Lattner
288bd1177d Use explicit ctor
llvm-svn: 3663
2002-09-10 22:37:46 +00:00
Chris Lattner
00fd7c012d Tighten up assertion checking for binary operators, not allowing invalid
instructions to _even be created_.

llvm-svn: 3661
2002-09-10 19:57:53 +00:00
Chris Lattner
a7e9aba28c Tighten up error checking in parser, disallowing instructions that f.e.,
add pointers together.

llvm-svn: 3660
2002-09-10 19:57:26 +00:00
Chris Lattner
acbd992f9d Fix bug: test/Regression/Transforms/LevelRaise/2002-09-10-PointerAdds.ll
llvm-svn: 3658
2002-09-10 19:42:53 +00:00
Chris Lattner
da9702a8a1 Simplify code (somtimes dramatically), by using the new "auto-insert" feature
of instruction constructors.

llvm-svn: 3656
2002-09-10 17:04:02 +00:00
Chris Lattner
5758cf6d77 Simplify code (somtimes dramatically), by using the new "auto-insert" feature
of instruction constructors.

llvm-svn: 3655
2002-09-10 17:03:06 +00:00
Chris Lattner
a63519afc8 Add support for printing constpointerrefs more nicely
llvm-svn: 3654
2002-09-10 15:53:49 +00:00
Chris Lattner
59efee4bf0 Add capability to insert an instruction into a basic block immediately after
it is created, as part of the ctor call.

Eliminate the GenericBinaryInst class

llvm-svn: 3653
2002-09-10 15:45:53 +00:00
Chris Lattner
0580054142 Remove extra #include
llvm-svn: 3652
2002-09-10 15:43:30 +00:00
Chris Lattner
9275e21d28 Clean up indvar printing
llvm-svn: 3650
2002-09-10 15:35:39 +00:00
Chris Lattner
7787814c22 * Clean up code a little bit
* Fix bug: test/Regression/Transforms/IndVarsSimplify/2002-09-09-PointerIndVar.ll

llvm-svn: 3644
2002-09-10 05:24:05 +00:00
Chris Lattner
a88aeefa30 Fix typeo in assertion message
llvm-svn: 3641
2002-09-10 04:52:59 +00:00
Chris Lattner
4f5abce7f6 Hack unneccesary now that shifts of pointers are no longer legal!
llvm-svn: 3640
2002-09-10 03:50:54 +00:00
Chris Lattner
aac1fc4581 Do not allow adds of pointer types, or many other operations on pointer types.
llvm-svn: 3638
2002-09-09 20:26:04 +00:00
Chris Lattner
f6a9e54dda Disallow creation of pointer typed shift instructions
llvm-svn: 3637
2002-09-09 20:25:21 +00:00
Vikram S. Adve
1b1f2b2f5e Silly bug fix: Machine code vector could be empty for a no-op cast instruction,
e.g., cast double to double.

llvm-svn: 3633
2002-09-09 14:54:21 +00:00
Chris Lattner
4b8ce3aed2 Factor silly code duplication out
llvm-svn: 3627
2002-09-08 21:47:54 +00:00
Chris Lattner
c1de581f8e Fix Bug: test/Regression/Transforms/InstCombine/2002-09-08-PointerShiftBug.ll
llvm-svn: 3626
2002-09-08 21:39:07 +00:00
Chris Lattner
22bcab6bd5 Make sure the leakdetector is told about temporary Phi nodes also, so it doesn't
erroneously report them as leaks

llvm-svn: 3624
2002-09-08 21:19:29 +00:00
Chris Lattner
1c2e1ebb5c Inform the memory leak detector that TmpInstruction objects should not be
subject to memory leak checking.

llvm-svn: 3623
2002-09-08 21:08:43 +00:00
Chris Lattner
ba447dd0a3 Enable "garbage detection" of LLVM objects. Check for leaks after running
every pass.

llvm-svn: 3621
2002-09-08 19:00:07 +00:00
Chris Lattner
3d630b954f Enable "garbage detection" of LLVM objects. Now users should be obnoxious
warnings.  If they accidentally leak LLVM Value's.

llvm-svn: 3620
2002-09-08 18:59:35 +00:00
Chris Lattner
c30029172a Minor simplification
llvm-svn: 3619
2002-09-08 18:55:04 +00:00
Chris Lattner
24e420fd81 Checkin initial support for automatic memory leak detection routines
llvm-svn: 3618
2002-09-08 18:51:16 +00:00
Chris Lattner
fb6bb789a1 * Add capability to recognize alias properties of the following common cases:
- A[c1] cannot alias A[c2] where constants c1 != c2
  - A[i] cannot alias B[j] if A & B are provably different arrays

This should help out array based codes.  For example, from bzip2 from spec,
3 additional loads can be GCSE'd, and _21_ additional loads can be LICMd due
to this change.

In a test example from the Spec GAP benchmark (vecffe.c), this change allows
_52_ additional loads to be GCSE'd and _224_ additional LICM'd loads.

Not bad for such a simple change.  Other testcases show no change at all
because they just don't use arrays.  Not too suprising there.

llvm-svn: 3616
2002-09-08 18:45:18 +00:00
Chris Lattner
c1e61532a0 Move code out of header files into .cpp files to make future changes easier
llvm-svn: 3605
2002-09-06 21:33:15 +00:00
Chris Lattner
01f30bf2a0 * Remove extraneous #includes
* Add extra argument to Function ctor to allow automatic insertion into module

llvm-svn: 3600
2002-09-06 20:46:32 +00:00
Chris Lattner
bd03f18e04 Initial checkin of Correlated Expression Elimination Pass
llvm-svn: 3599
2002-09-06 18:41:55 +00:00
Chris Lattner
bf38fcf5ee Fix file header to be accurate, instead of something I just copied and pasted.
llvm-svn: 3591
2002-09-06 03:59:56 +00:00
Chris Lattner
78a3ebaa18 Fix bug with critical edge splitting code where it wouldn't update PHI nodes
in the old destination block to indicate that the value flows from the new
edge splitting block, not from the original multi-successor block.

llvm-svn: 3590
2002-09-06 03:51:45 +00:00
Chris Lattner
c3c754062f Check in the implementation of critical edge detection and splitting
llvm-svn: 3588
2002-09-06 02:35:34 +00:00
Vikram S. Adve
58e8292647 Add new function UltraSparcInstrInfo::CreateZeroExtensionInstructions.
llvm-svn: 3581
2002-09-05 18:34:31 +00:00
Vikram S. Adve
e9990478f0 Bug fixes in casting between floats and ints smaller than 64 bits.
Add UltraSparcInstrInfo::CreateZeroExtensionInstructions to help with that.

llvm-svn: 3580
2002-09-05 18:33:59 +00:00
Vikram S. Adve
94b41af2f3 -- Use size of pointer element type instead of pointer type in array offsets!
-- A few bug fixes in casting between floats and ints.
-- Use SRL reg, 0 instead of AND reg, 0xffffffff to clear high 32 bits.

llvm-svn: 3579
2002-09-05 18:32:13 +00:00
Vikram S. Adve
e7aa2bf095 -- Bug fix: use byte offsets not typed offsets in output assembly!
-- Add support for ConstantExpr constants (only cast and add operators so far)
-- Avoid generating label Bbss.bss, which sometimes came out twice.

llvm-svn: 3578
2002-09-05 18:28:10 +00:00
Chris Lattner
fa03431b04 Minor bug fix.
llvm-svn: 3577
2002-09-03 23:12:40 +00:00
Chris Lattner
c78ae565ef Implement setcc for booleans. Fixes bug:
test/Regression/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll

llvm-svn: 3576
2002-09-03 20:09:49 +00:00
Chris Lattner
3ce5b343c5 - Renamed Type::isIntegral() to Type::isInteger()
- Added new method Type::isIntegral() that is the same as isInteger, but
    also accepts bool.

llvm-svn: 3574
2002-09-03 01:08:28 +00:00
Chris Lattner
904f214a13 - Renamed Type::isIntegral() to Type::isInteger()
- Added new method Type::isIntegral() that is the same as isInteger, but
    also accepts bool.

llvm-svn: 3573
2002-09-03 01:07:35 +00:00
Chris Lattner
e4bba98678 - Renamed Type::isIntegral() to Type::isInteger()
- Added new method Type::isIntegral() that is the same as isInteger, but
    also accepts bool.
SCVS: ----------------------------------------------------------------------

llvm-svn: 3572
2002-09-03 01:05:48 +00:00
Chris Lattner
1d80a4fb6c Fix bugs
llvm-svn: 3569
2002-09-02 20:49:27 +00:00
Chris Lattner
cd49f0ec5d Add constant prop & DIE to InstCombine, so it cleans up after itself
llvm-svn: 3568
2002-09-02 04:59:56 +00:00
Chris Lattner
1d7454a065 Add printing support to ConstantRange class
llvm-svn: 3565
2002-09-02 00:18:22 +00:00
Chris Lattner
dde20e4a6b Initial implementation of ConstantRange support
llvm-svn: 3563
2002-09-01 23:53:36 +00:00
Chris Lattner
5775f64365 - Exposed SetCondInst::getInverseCondition & ::getSwappedCondition better
llvm-svn: 3562
2002-09-01 19:46:40 +00:00
Chris Lattner
073971b535 - Fix bug: test/Regression/CBackend/2002-08-20-RecursiveTypes.ll
- Converted CWriter to be an LLVM pass.

llvm-svn: 3558
2002-08-31 00:29:16 +00:00
Chris Lattner
bb8f1a072b - Implement SCCP of getelementptr instructions
- Implement SCCP of globals into ConstantExprs hopefully opening new
   opportunities for more SCCP.

llvm-svn: 3555
2002-08-30 23:39:00 +00:00
Chris Lattner
838248b35a - Eliminate the last traces of the 'analysis' namespace
llvm-svn: 3550
2002-08-30 22:53:53 +00:00
Chris Lattner
a146c9e769 Really minor cleanups
llvm-svn: 3549
2002-08-30 22:53:30 +00:00
Chris Lattner
ecf8698b8b AsmParser now depends on clients to verify that input is well formed
llvm-svn: 3548
2002-08-30 22:52:23 +00:00
Chris Lattner
c94462fbe9 Minor cleanups so I can remove BasicValueNumbering.h
llvm-svn: 3544
2002-08-30 22:30:36 +00:00
Chris Lattner
8b13415389 initial implementation of ValueNumbering interface.
llvm-svn: 3541
2002-08-30 20:29:02 +00:00
Chris Lattner
9c31585ee4 Initial implementation of value numbering for load instructions
llvm-svn: 3540
2002-08-30 20:28:10 +00:00
Chris Lattner
67f9108e98 - Use Pass::AnalysisImpls instead of findAnalysisGroupMemeber
- -debug-pass=Details now prints implementation class names for analysis
    groups
  - Rework how AnalysisGroups are resolved to be simpler and better.

llvm-svn: 3535
2002-08-30 20:25:01 +00:00
Chris Lattner
f743017498 - PassManager prints analysis sets nicer
- Use Pass::AnalysisImpls instead of findAnalysisGroupMemeber

llvm-svn: 3534
2002-08-30 20:23:45 +00:00
Chris Lattner
b0cbcfd5e4 - GCSE now no longer counts instructions not removed (due to no common
dominator as being removed)
  - GCSE now uses new Value #'ing interface, instead of dealing with AA itself
  - GCSE worklist implementation much simpler, class cleaned up.

llvm-svn: 3533
2002-08-30 20:22:29 +00:00
Chris Lattner
c43d102d67 Remove unneeded #include
llvm-svn: 3524
2002-08-29 20:08:55 +00:00
Anand Shukla
9a0d43e242 moved this file from lib/Reoptimizer/Mapping
llvm-svn: 3519
2002-08-27 22:47:33 +00:00
Anand Shukla
687dea3dcf Makefile for new sub directory
llvm-svn: 3518
2002-08-27 22:46:38 +00:00
Anand Shukla
5bb28c7358 Added Mapping subdir
llvm-svn: 3517
2002-08-27 22:45:49 +00:00
Chris Lattner
236778fa0f Implement ConstantPointerRef support, & ConstantExpr support for Cast, GEP & Add.
llvm-svn: 3516
2002-08-27 22:33:45 +00:00
Anand Shukla
c7068ce4d0 added Reoptimizer in Makefile DIRS
llvm-svn: 3515
2002-08-27 22:05:53 +00:00
Anand Shukla
b18da43529 Added getFunctionInfo and MappingInfoForFunction pass, and fixed the earlier error in compiling
llvm-svn: 3513
2002-08-27 16:45:17 +00:00
Chris Lattner
7a75a8e108 Fix bug: test/Regression/CBackend/2002-08-26-IndirectCallTest.ll
llvm-svn: 3511
2002-08-26 20:50:09 +00:00
Chris Lattner
cc9d7e01c9 Add support for turning an array of characters into a string.
llvm-svn: 3509
2002-08-26 17:53:56 +00:00
Anand Shukla
1e105cdb7c Changed so it gets linked properly
llvm-svn: 3508
2002-08-26 16:45:19 +00:00
Vikram S. Adve
9369cfea20 Fix the way parens are printed around "*ptrName" so that
no parens are printed around  *, **, ... alone, except if
it is a pointer type for which no name should be printed,
as in the result of a cast.

llvm-svn: 3506
2002-08-25 20:00:08 +00:00
Vikram S. Adve
b8a0f00662 Use newly-added type inspection support in InstTreeNode subclasses.
llvm-svn: 3501
2002-08-24 21:02:09 +00:00
Vikram S. Adve
3190395e10 Moved code here to extract memory instruction indices and to check
whether FoldGetElemNodes should be called.  This is machine-independent
but was in the Sparc directory.  This is in a new function: GetMemInstArgs.

llvm-svn: 3500
2002-08-24 21:00:08 +00:00
Vikram S. Adve
87367a8b67 LoadIdx non-terminal no longer needed.
llvm-svn: 3499
2002-08-24 20:58:04 +00:00
Vikram S. Adve
96a4efb0a6 Sign-extend values used to index arrays (and Simplify
SetOperandsForMemInstr significantly).  Load and Store
no longer have any indices.  Eliminate spurious sign-extension
on a cast to float/double.

llvm-svn: 3498
2002-08-24 20:56:53 +00:00
Vikram S. Adve
ec7858cc82 Fix sign-extension: it needs to happen *after* multiplying by type size.
llvm-svn: 3497
2002-08-24 14:44:58 +00:00
Vikram S. Adve
d499981c22 Sign-extend array index expressions to work correctly on non-32 bit machines.
llvm-svn: 3496
2002-08-24 14:44:23 +00:00
Chris Lattner
66b1127636 - instcombine demorgan's law: and (not A), (not B) == not (or A, B)
llvm-svn: 3495
2002-08-23 18:32:43 +00:00
Anand Shukla
e2a8fb2f79 Changed default value of 3rd parameter in function definition
llvm-svn: 3492
2002-08-23 10:55:49 +00:00
Anand Shukla
656de9732b Added #include <alloca.h>
llvm-svn: 3491
2002-08-23 10:54:26 +00:00
Vikram S. Adve
da747e6066 Simplify previous hack slightly.
llvm-svn: 3490
2002-08-23 03:21:01 +00:00
Vikram S. Adve
ced94f5f61 Force sign-extension for uint array indexes from 32-bit to 64-bits
since uint is not normally sign-extended when casting to uint64_t.

llvm-svn: 3489
2002-08-23 02:55:51 +00:00
Chris Lattner
9f18db8156 Eliminated the MemAccessInst class, folding contents into GEP class.
llvm-svn: 3488
2002-08-22 23:37:24 +00:00
Chris Lattner
20b85d96e4 Eliminated the MemAccessInst class, folding contents into GEP class.
llvm-svn: 3487
2002-08-22 23:37:20 +00:00
Chris Lattner
969c616d51 Load & StoreInst no longer derive from MemAccessInst, so we don't have
to handle indexing anymore

llvm-svn: 3485
2002-08-22 22:49:05 +00:00
Chris Lattner
21c27f79be Load & StoreInst no longer derive from MemAccessInst, so we don't have
to handle indexing anymore

llvm-svn: 3484
2002-08-22 22:48:55 +00:00
Chris Lattner
65920fff34 *** empty log message ***
llvm-svn: 3483
2002-08-22 22:48:32 +00:00
Chris Lattner
d123fc1e41 Load and Store now no longer derive from MemAccessInst. Indexing a load or
store is not possible anymore.

llvm-svn: 3482
2002-08-22 22:47:47 +00:00
Chris Lattner
4335ee9dc4 doxygenize comments
llvm-svn: 3481
2002-08-22 22:46:39 +00:00
Chris Lattner
8b8d72c1f2 Add capability of using pointer analysis to LICM
llvm-svn: 3478
2002-08-22 21:39:55 +00:00
Chris Lattner
5addf774a3 Remove long obsolete comments
llvm-svn: 3476
2002-08-22 21:25:54 +00:00
Chris Lattner
e6cf772ddd Fix bug: test/Regression/Assembler/2002-08-22-DominanceProblem.ll
llvm-svn: 3474
2002-08-22 20:39:29 +00:00
Chris Lattner
18826b07fe Instcombine PHI's of the form %PN = phi PN, X into X and
%PN = phi PN, PN, PN into 0 (because the phi must not be reachable)

llvm-svn: 3470
2002-08-22 20:22:01 +00:00