Dan Gohman
e0744f181b
Use Function's arg_size() and size() methods.
...
llvm-svn: 52605
2008-06-21 22:06:54 +00:00
Chris Lattner
96b3955e9b
fix some warnings when assertions are disabled.
...
llvm-svn: 52587
2008-06-21 19:47:03 +00:00
Dan Gohman
bcddb92f4e
Simplify this code. Thanks Chris!
...
llvm-svn: 52514
2008-06-20 00:47:44 +00:00
Dan Gohman
c190d65454
Auto-upgrade code for multiple-value return statements. This code
...
isn't actually called yet.
llvm-svn: 52435
2008-06-17 23:38:43 +00:00
Dan Gohman
d9d529d7ed
In InsertValueInst's copy ctor, actually copy the operands.
...
llvm-svn: 52434
2008-06-17 23:25:49 +00:00
Dan Gohman
24d9c8400f
Implement the ExtractValueInst::getIndexedType that accepts one
...
index value.
llvm-svn: 52432
2008-06-17 21:07:55 +00:00
Owen Anderson
79605db969
Add an insertBefore method for attaching previously unattached instructions,
...
such as those created by clone(), to a basic block.
llvm-svn: 52424
2008-06-17 18:29:27 +00:00
Chris Lattner
dd707dc82d
switch TypeHasCycleThroughItself from using an std::set to using a SmallPtrSet,
...
this speeds up the linking testcase in PR1860 by 44% (.379 -> 0.263)
llvm-svn: 52365
2008-06-16 21:20:58 +00:00
Chris Lattner
09554fd076
fix pr2460
...
llvm-svn: 52294
2008-06-16 04:02:40 +00:00
Evan Cheng
5897328890
Do not speculatively execute an instruction by hoisting it to its predecessor BB if any of its operands are defined but not used in BB. The transformation will prevent the operand from being sunk into the use block.
...
llvm-svn: 52244
2008-06-12 21:15:59 +00:00
Dan Gohman
68f8fbdac4
Re-apply 52002, allowing the verifier to accept non-MRV struct return
...
types on functions, with adjustments so that it accepts both
new-style aggregate returns and old-style MRV returns, including those
with only a single member.
llvm-svn: 52157
2008-06-09 21:26:13 +00:00
Gabor Greif
7c2e365dbc
get rid of ExtractValueInst::init's Value argument, it is already passed to the UnaryInstruction ctor
...
llvm-svn: 52064
2008-06-06 21:06:32 +00:00
Gabor Greif
8ac103e71d
make ExtractValueInst derived from UnaryInstruction
...
llvm-svn: 52061
2008-06-06 20:28:12 +00:00
Devang Patel
1db00c242e
Print debug message only if there are dead passes.
...
llvm-svn: 52052
2008-06-06 17:50:36 +00:00
Duncan Sands
d634afe3aa
Wrap MVT::ValueType in a struct to get type safety
...
and better control the abstraction. Rename the type
to MVT. To update out-of-tree patches, the main
thing to do is to rename MVT::ValueType to MVT, and
rewrite expressions like MVT::getSizeInBits(VT) in
the form VT.getSizeInBits(). Use VT.getSimpleVT()
to extract a MVT::SimpleValueType for use in switch
statements (you will get an assert failure if VT is
an extended value type - these shouldn't exist after
type legalization).
This results in a small speedup of codegen and no
new testsuite failures (x86-64 linux).
llvm-svn: 52044
2008-06-06 12:08:01 +00:00
Dan Gohman
70fe9e347d
Revert 52002.
...
llvm-svn: 52030
2008-06-05 23:57:06 +00:00
Matthijs Kooijman
ebf00c0f65
Change the Verifier to support returning first class aggregrates.
...
Add a testcase for functions returning first class aggregrates.
llvm-svn: 52002
2008-06-05 14:00:36 +00:00
Matthijs Kooijman
6216df14cb
* Make CallSite::hasArgument const and let it take a const parameter.
...
llvm-svn: 51989
2008-06-05 08:04:58 +00:00
Matthijs Kooijman
de47a7518d
Add CallSite::hasArgument to allow for seeing if a call passes a certain value as an argument quickly.
...
llvm-svn: 51946
2008-06-04 16:31:12 +00:00
Matthijs Kooijman
318e1df0e4
Add a Name parameter to two of the init methods of GetElementPointer to make the name setting more consistent.
...
llvm-svn: 51945
2008-06-04 16:14:12 +00:00
Matthijs Kooijman
2f6b694afc
Implement the two constructors in InsertValueInst and ExtractValueInst.
...
Add a Name argment to two init methods in these classes as well to make things
a bit more consistent.
llvm-svn: 51937
2008-06-04 14:40:55 +00:00
Evan Cheng
20d22b220a
More pass manager debugging outputs.
...
llvm-svn: 51930
2008-06-04 09:13:31 +00:00
Dale Johannesen
2803c991a5
Prevent a crash in debug dumps.
...
llvm-svn: 51910
2008-06-03 18:14:29 +00:00
Devang Patel
edc62adcd9
"Unable to schedule <A> required by <B>" is more helpful then
...
"Unable to handle Pass that requires lower level Analysis pass"
llvm-svn: 51892
2008-06-03 01:20:02 +00:00
Devang Patel
390d72740e
Add debugging aid.
...
llvm-svn: 51891
2008-06-03 01:02:16 +00:00
Dan Gohman
fbf0f6cf8e
Constant folding for insertvalue and extractvalue.
...
llvm-svn: 51889
2008-06-03 00:15:20 +00:00
Dan Gohman
06d49b3c5b
AsmWriter support for insertvalue/extractvalue. These instructions can
...
now round-trip through assembly and bitcode.
llvm-svn: 51823
2008-05-31 19:12:39 +00:00
Dan Gohman
caa9c6e94d
Fix some bugs with the handling of indices in insertvalue/extractvalue.
...
llvm-svn: 51820
2008-05-31 19:09:08 +00:00
Dan Gohman
1ab21af8e0
Factor several methods, including getInversePredicate and
...
getSwappedPredicate, from ICmpInst and FCmpInst into common
methods in CmpInst. This allows CmpInsts to be manipulated
generically.
llvm-svn: 51810
2008-05-31 02:47:54 +00:00
Dan Gohman
ac5c3382fe
IR, bitcode reader, bitcode writer, and asmparser changes to
...
insertvalue and extractvalue to use constant indices instead of
Value* indices. And begin updating LangRef.html.
There's definately more to come here, but I'm checking this
basic support in now to make it available to people who are
interested.
llvm-svn: 51806
2008-05-31 00:58:22 +00:00
Matthijs Kooijman
32c5d3a9ee
Let Instruction::getOpcodeName() return something useful for the new
...
insertvalue / extractvalue instructions.
llvm-svn: 51766
2008-05-30 10:31:54 +00:00
Gabor Greif
2abf6ec2e5
back out last commit: The .cpp file for a module should include its corresponding header first, even if redundant.
...
llvm-svn: 51598
2008-05-27 17:26:02 +00:00
Gabor Greif
0b9cf0d491
prune unneeded #includes
...
llvm-svn: 51590
2008-05-27 11:06:03 +00:00
Gabor Greif
0fb81af839
remove unneeded reinterpret_casts
...
llvm-svn: 51589
2008-05-27 11:03:29 +00:00
Gabor Greif
b93cb3dc6f
We have the correct headers included to know that BB isa Value. No reinterpret_cast necessary.
...
llvm-svn: 51588
2008-05-27 10:48:39 +00:00
Gabor Greif
e052a42a62
eliminate calls to deprecated Use::init() interface
...
llvm-svn: 51570
2008-05-26 21:33:52 +00:00
Duncan Sands
fa995d7cc5
Factor code to copy global value attributes like
...
the section or the visibility from one global
value to another: copyAttributesFrom. This is
particularly useful for duplicating functions:
previously this was done by explicitly copying
each attribute in turn at each place where a
new function was created out of an old one, with
the result that obscure attributes were regularly
forgotten (like the collector or the section).
Hopefully now everything is uniform and nothing
is forgotten.
llvm-svn: 51567
2008-05-26 19:58:59 +00:00
Evan Cheng
e5e0b4660d
Eliminate x86.sse2.punpckh.qdq and x86.sse2.punpckl.qdq.
...
llvm-svn: 51533
2008-05-24 02:56:30 +00:00
Evan Cheng
564238c841
Eliminate x86.sse2.movs.d, x86.sse2.shuf.pd, x86.sse2.unpckh.pd, and x86.sse2.unpckl.pd intrinsics. These will be lowered into shuffles.
...
llvm-svn: 51531
2008-05-24 02:14:05 +00:00
Evan Cheng
365e0f3932
Autoupgrade x86.sse2.loadh.pd and x86.sse2.loadl.pd.
...
llvm-svn: 51523
2008-05-24 00:08:39 +00:00
Dan Gohman
8b6f4366ae
Tidy up BasicBlock::getFirstNonPHI, and change a bunch of places to
...
use it instead of duplicating its functionality.
llvm-svn: 51499
2008-05-23 21:05:58 +00:00
Dan Gohman
c877140168
Add #includes to make some dependencies explicit.
...
llvm-svn: 51496
2008-05-23 20:40:06 +00:00
Dan Gohman
9674662036
Add more IR support for the new extractvalue and insertvalue
...
instructions.
llvm-svn: 51461
2008-05-23 00:36:11 +00:00
Chris Lattner
beb6254442
Fix PR2267, by allowing indirect outputs to be intermixed
...
with normal outputs. Testcase here:
test/CodeGen/X86/asm-indirect-mem.ll
llvm-svn: 51409
2008-05-22 04:46:38 +00:00
Gordon Henriksen
a1f7004038
Remove a duplicative binding. Patch by Mahadevan R.
...
llvm-svn: 51238
2008-05-19 05:47:10 +00:00
Nick Lewycky
46e3a168c0
Revert constant-folding change that will miscompile in some cases.
...
llvm-svn: 51223
2008-05-17 19:00:05 +00:00
Nick Lewycky
baa90d4eef
Unbreak the build.
...
llvm-svn: 51217
2008-05-17 09:05:22 +00:00
Nick Lewycky
1df40102a9
Constant fold inttoptr and ptrtoint.
...
llvm-svn: 51216
2008-05-17 09:03:26 +00:00
Eric Christopher
11359e9b1c
Add functions to enable adding a single attribute to a function and
...
its associated call site.
llvm-svn: 51204
2008-05-16 20:39:43 +00:00
Gabor Greif
d61f20217a
API change for {BinaryOperator|CmpInst|CastInst}::create*() --> Create. Legacy interfaces will be in place for some time. (Merge from use-diet branch.)
...
llvm-svn: 51200
2008-05-16 19:29:10 +00:00
Dan Gohman
fe7f6bc9ce
Revert the change from r51157 in
...
test/Verifier/2002-11-05-GetelementptrPointers.ll, which was incorrect.
Instead, fix getIndexedType to not follow pointer types, as
PointerType is a subclass of CompositeType.
llvm-svn: 51171
2008-05-16 00:16:32 +00:00
Dan Gohman
821bf58428
IR support for extractvalue and insertvalue instructions. Also, begin
...
moving toward making structs and arrays first-class types.
llvm-svn: 51157
2008-05-15 19:50:34 +00:00
Gabor Greif
48ffb6c7dc
Fix a bunch of 80col violations that arose from the Create API change. Tweak makefile targets to find these better.
...
llvm-svn: 51143
2008-05-15 10:04:30 +00:00
Nate Begeman
253fc69ff3
Move the operator new and operator delete out of line. This fixes an issue with
...
operator new() referring to the static initTags function, which has to be in the
same linkage unit as any file including User.h.
llvm-svn: 51136
2008-05-15 01:23:11 +00:00
Dale Johannesen
768b6f281e
Add CommonLinkage; currently tentative definitions
...
are represented as "weak", but there are subtle differences
in some cases on Darwin, so we need both. The intent
is that "common" will behave identically to "weak" unless
somebody changes their target to do something else.
No functional change as yet.
llvm-svn: 51118
2008-05-14 20:12:51 +00:00
Dan Gohman
fe628b229c
Make PreVerifyID, IntSigsEnd, and KillSigsEnd const.
...
llvm-svn: 51088
2008-05-14 00:42:30 +00:00
Gabor Greif
dd2f5c797d
Merge of r51073-51074 from use-diet branch.
...
Do not rely on std::swap<Use>, provide a (faster) member function instead.
This change is primarily necessitated by MSVC++'s incompatibility with
declaring std::swap<Use> to be a friend of Use.
Also contains some minor tweaks to Use inline functions,
to undo pointless changes that sneaked in with the last merge.
llvm-svn: 51078
2008-05-13 22:51:52 +00:00
Devang Patel
bae88af8c1
Dominance Frontier is cfg only pass.
...
llvm-svn: 51075
2008-05-13 22:43:21 +00:00
Gabor Greif
22afb1f8f0
Derive GetResultInst from UnaryInstruction, this simplifies code and removes a FIXME.
...
llvm-svn: 51023
2008-05-13 07:09:08 +00:00
Dan Gohman
138a53b303
Change class' public PassInfo variables to by initialized with the
...
address of the PassInfo directly instead of calling getPassInfo.
This eliminates a bunch of dynamic initializations of static data.
Also, fold RegisterPassBase into PassInfo, make a bunch of its
data members const, and rearrange some code to initialize data
members in constructors instead of using setter member functions.
llvm-svn: 51022
2008-05-13 02:05:11 +00:00
Dan Gohman
bab18cae46
Clean up the use of static and anonymous namespaces. This turned up
...
several things that were neither in an anonymous namespace nor static
but not intended to be global.
llvm-svn: 51017
2008-05-13 00:00:25 +00:00
Nate Begeman
b72a398339
Pointer comparisons should be handled by icmp, not vicmp :)
...
llvm-svn: 50994
2008-05-12 20:11:05 +00:00
Nate Begeman
6258a36fe3
Hard code CmpInst back to i1 for now while I go track down what in the bitcode reader/writer is assuming i1
...
This was breaking a bunch of tests
llvm-svn: 50992
2008-05-12 20:01:56 +00:00
Nate Begeman
e2b25610bb
Fix build breakage
...
llvm-svn: 50986
2008-05-12 19:23:22 +00:00
Nate Begeman
b5b1e1353b
Add two new instructions to the llvm IR, vicmp and vfcmp. see updated LangRef
...
for details. CodeGen support coming in a follow up patch
llvm-svn: 50985
2008-05-12 19:01:56 +00:00
Dan Gohman
4f0d9d18c3
Update comments.
...
llvm-svn: 50974
2008-05-12 16:34:30 +00:00
Gabor Greif
49bf1a4cf6
merge of use-diet branch to trunk
...
llvm-svn: 50943
2008-05-10 08:32:32 +00:00
Anton Korobeynikov
0f467b9965
Check for validity of aliasee pointer before dereference.
...
llvm-svn: 50878
2008-05-08 23:11:06 +00:00
Chris Lattner
e3970f1e95
conservatively say that volatile stores read memory.
...
llvm-svn: 50872
2008-05-08 21:58:49 +00:00
Chris Lattner
1e4afe8fa7
store can't read from memory.
...
llvm-svn: 50869
2008-05-08 21:47:43 +00:00
Chris Lattner
3c362081d5
add a new Instruction::mayReadFromMemory predicate, make
...
Instruction::mayWriteToMemory stronger for invokes.
llvm-svn: 50858
2008-05-08 17:16:51 +00:00
Anton Korobeynikov
ddb93e7a02
Turn StripPointerCast() into a method
...
llvm-svn: 50836
2008-05-07 22:54:15 +00:00
Anton Korobeynikov
90ee6d6616
Make StripPointerCast a common function (should we mak it method of Value instead?)
...
llvm-svn: 50775
2008-05-06 22:52:30 +00:00
Dan Gohman
a84b75df17
Remove uses of llvm/System/IncludeFile.h that are no longer needed.
...
llvm-svn: 50695
2008-05-06 01:32:53 +00:00
Gordon Henriksen
6f33fd36ab
Use (void) instead of () in C code.
...
llvm-svn: 50620
2008-05-04 12:55:34 +00:00
Evan Cheng
c1c2adbfc6
Add separate intrinsics for MMX / SSE shifts with i32 integer operands. This allow us to simplify the horribly complicated matching code.
...
llvm-svn: 50601
2008-05-03 00:52:09 +00:00
Chris Lattner
757d7d318a
fix a bug in my previous patch, a classic =/== bug.
...
llvm-svn: 50483
2008-04-30 15:27:09 +00:00
Chris Lattner
710d05695f
add a method for comparing to see if a value has a specified name.
...
llvm-svn: 50465
2008-04-30 03:55:40 +00:00
Gordon Henriksen
0b2f0d3007
Expose parameter attributes via C bindings.
...
Patch by Anders Johnsen!
llvm-svn: 50360
2008-04-28 17:37:06 +00:00
Chris Lattner
bef7aa1d4b
Allow asms to return multiple results by value.
...
llvm-svn: 50328
2008-04-27 23:33:55 +00:00
Nick Lewycky
1f831c0f57
Remove 'unwinds to' support from mainline. This patch undoes r47802 r47989
...
r48047 r48084 r48085 r48086 r48088 r48096 r48099 r48109 and r48123.
llvm-svn: 50265
2008-04-25 16:53:59 +00:00
Chris Lattner
50069efc7a
tighten up verifier checks which missed cases where
...
return instrs operands didn't match up with function results.
llvm-svn: 50182
2008-04-23 20:33:41 +00:00
Chris Lattner
39e4b2e5d2
Enforce that multiple return values have to have at least one result.
...
llvm-svn: 50137
2008-04-23 05:36:34 +00:00
Chris Lattner
bc7ea01b8a
Verify that the operand of a getresult instruction is a
...
call/invoke or undef.
llvm-svn: 50129
2008-04-23 04:06:15 +00:00
Chris Lattner
188b560336
more fallout from Nicholas' asmprinter patch.
...
llvm-svn: 50078
2008-04-22 02:45:44 +00:00
Chris Lattner
7925af6adf
don't print dominators every time it is computed with -debug.
...
llvm-svn: 50032
2008-04-21 06:19:02 +00:00
Chris Lattner
c077c2a4ea
another bug introduced in r47802 by nicholas, for no apparent reason.
...
llvm-svn: 50031
2008-04-21 06:12:55 +00:00
Chris Lattner
26468c09af
fix a bug introduced by Nicholas' "unwinds to" stuff: we
...
lost newlines between blocks.
llvm-svn: 50024
2008-04-21 04:20:33 +00:00
Chris Lattner
368e2b28bf
add a handy helper method to instruction, useful for determining
...
whether it is used outside of some block. This can be used to see
if there are any non-local references, for example.
llvm-svn: 50004
2008-04-20 22:11:30 +00:00
Chris Lattner
75df16a5b0
hopefully resolve PR2240
...
llvm-svn: 49999
2008-04-20 19:59:12 +00:00
Chris Lattner
2bed045e5e
rearrange some code, simplify handling of shifts.
...
llvm-svn: 49995
2008-04-20 18:24:14 +00:00
Chris Lattner
0cda383725
Use simplified ConstantFP::get method, fix a bug handling frem x, 0 with long doubles.
...
llvm-svn: 49976
2008-04-20 00:26:06 +00:00
Chris Lattner
8cde1e71f0
Implement PR2206.
...
llvm-svn: 49967
2008-04-19 22:17:26 +00:00
Chris Lattner
1303e72c66
refactor handling of symbolic constant folding, picking up
...
a few new cases( see Integer/a1.ll), but not anything that
would happen in practice.
llvm-svn: 49965
2008-04-19 21:58:19 +00:00
Chris Lattner
57bd4076b5
indentation fix.
...
llvm-svn: 49964
2008-04-19 21:13:00 +00:00
Dale Johannesen
87b88d2a8f
Don't read off end of the input array.
...
llvm-svn: 49799
2008-04-16 17:31:41 +00:00
Owen Anderson
030428b435
Major repairs to the post-dominators implementation. Patch from Florian Brandner!
...
llvm-svn: 49768
2008-04-16 04:21:16 +00:00
Dan Gohman
6c8b715be0
VAArg may trap.
...
llvm-svn: 49646
2008-04-14 15:07:08 +00:00
Duncan Sands
c5f548f784
Merge LLVMBuilder and FoldingBuilder, calling
...
the result IRBuilder. Patch by Dominic Hamon.
llvm-svn: 49604
2008-04-13 06:22:09 +00:00
Dan Gohman
26c2127be9
Make several symbols static.
...
llvm-svn: 49496
2008-04-10 21:11:47 +00:00
Chris Lattner
843ee88189
add a simplified accessor for creating an fp constant of a
...
particular value but variable type.
llvm-svn: 49416
2008-04-09 06:38:30 +00:00
Chris Lattner
9d4d2f566e
add a version of ConstantFP::get that doesn't take a redundant Type* value,
...
start migrating code over to use it.
llvm-svn: 49413
2008-04-09 00:45:01 +00:00
Duncan Sands
f86399a00f
Convenience method for setting the nounwind
...
attribute for a function.
llvm-svn: 49373
2008-04-08 07:23:58 +00:00
Duncan Sands
c68e092c44
Make sure that intrinsics automagically get the
...
right parameter attributes no matter how they
are obtained.
llvm-svn: 49335
2008-04-07 13:39:11 +00:00
Gabor Greif
c82cfa3755
fix a warning
...
llvm-svn: 49282
2008-04-06 21:42:13 +00:00
Gabor Greif
6c6b8a57f3
API changes for class Use size reduction, wave 1.
...
Specifically, introduction of XXX::Create methods
for Users that have a potentially variable number of
Uses.
llvm-svn: 49277
2008-04-06 20:25:17 +00:00
Chris Lattner
d141d16ed7
Change the MemoryBuffer::getFile* methods to take just a pointer to the
...
start of a filename, not a filename+length. All clients can produce a
null terminated name, and the system api's require null terminated
strings anyway.
llvm-svn: 49041
2008-04-01 18:04:03 +00:00
Nate Begeman
610aa2511c
Don't eliminate bitcast instructions that change the type of a pointer
...
llvm-svn: 48971
2008-03-31 00:22:16 +00:00
Duncan Sands
39afad0613
Fix comment typo.
...
llvm-svn: 48967
2008-03-30 19:38:55 +00:00
Nick Lewycky
96038a0528
Update example to new syntax.
...
llvm-svn: 48910
2008-03-28 06:46:51 +00:00
Dan Gohman
2b96ce84aa
Add explicit keywords.
...
llvm-svn: 48801
2008-03-25 22:06:05 +00:00
Evan Cheng
8cb64d8e8b
Handle a special case xor undef, undef -> 0. Technically this should be transformed to undef. But this is such a common idiom (misuse) we are going to handle it.
...
llvm-svn: 48792
2008-03-25 20:08:07 +00:00
Bill Wendling
b433b67093
Fix PR2062: Don't build Intrinsics.gen in the source directory. Do it in the
...
object directory.
llvm-svn: 48766
2008-03-25 09:12:48 +00:00
Dan Gohman
fec60bb357
Shrink the size of AllocationInst by using its SubclassData
...
field to store the alignment value instead of haing a
separate field.
llvm-svn: 48727
2008-03-24 16:55:58 +00:00
Gordon Henriksen
52f3a08237
Objective Caml bindings for basic block, function, global, and arg iterators.
...
llvm-svn: 48711
2008-03-23 22:21:29 +00:00
Anton Korobeynikov
5dfc7591ef
Fix merge error
...
llvm-svn: 48687
2008-03-22 08:50:08 +00:00
Anton Korobeynikov
25a0157827
Add testcase for prev. commit. Minor fixes
...
llvm-svn: 48686
2008-03-22 08:37:05 +00:00
Anton Korobeynikov
197f07a72b
Aliasing chains cleanups: update langref, add check into verifier
...
llvm-svn: 48685
2008-03-22 08:36:14 +00:00
Anton Korobeynikov
06f3b7f4ee
Support chained aliases for LLVM IR printing. This fixes PR2145
...
llvm-svn: 48684
2008-03-22 08:17:17 +00:00
Anton Korobeynikov
6ba56eb5e7
Slightly increase default set size. It's cheap and won't hurt.
...
llvm-svn: 48682
2008-03-22 07:48:40 +00:00
Dan Gohman
a363ba510c
Don't include <map> in Pass.h, which doesn't need it. This requires
...
adding <map> to many files that actually do need it.
llvm-svn: 48667
2008-03-21 23:51:57 +00:00
Duncan Sands
a53967843f
Make it possible to get an empty struct using
...
the new StructType::get method. The second NULL
is to pacify the gcc warning mechanism. This
patch compiles but is otherwise untested.
llvm-svn: 48645
2008-03-21 15:53:17 +00:00
Evan Cheng
4ae9fee64c
Undo 48570. Correctly match mmx shift instructions with an immediate operand.
...
llvm-svn: 48627
2008-03-21 00:40:09 +00:00
Devang Patel
1b64c7d1e5
These passes preserve CFG.
...
This patch fixes Benchmarks/Trimaran/enc-pc1/enc-pc1 failure reported by Grawp-PIC i386 nightly tester
llvm-svn: 48623
2008-03-20 23:27:18 +00:00
Devang Patel
f15fe34521
Restore isCFGOnly property of various analysis passes.
...
llvm-svn: 48579
2008-03-20 02:25:21 +00:00
Devang Patel
e4f39224eb
Keep track of analysis information inherited from Module pass manager.
...
llvm-svn: 48576
2008-03-20 01:09:53 +00:00
Evan Cheng
6f729b2820
Add intrinsics to match mmx shift builtin's with immediate operand.
...
llvm-svn: 48569
2008-03-19 23:38:52 +00:00
Devang Patel
3af681c5fb
#if 1 .. #endif markers do not add any value.
...
llvm-svn: 48560
2008-03-19 22:24:25 +00:00
Devang Patel
5e8cbbea65
PassInfo keep tracks whether a pass is an analysis pass or not.
...
llvm-svn: 48554
2008-03-19 21:56:59 +00:00
Chris Lattner
1642451cf7
add some convenience methods for creating GEP instructions and
...
struct types. Patch by David Chisnall, with some tweaks.
llvm-svn: 48531
2008-03-19 05:06:05 +00:00
Gordon Henriksen
e4b3339de8
C bindings for Module-, Function-, and BasicBlock::iterator.
...
llvm-svn: 48528
2008-03-19 03:47:18 +00:00
Gordon Henriksen
15006d5da0
C and Objective Caml bindings for the various getParent methods of the IR.
...
Based on Erick Tryzelaar's patch.
llvm-svn: 48523
2008-03-19 01:11:35 +00:00
Devang Patel
38f181fa8c
Do not use virtual function to identify an analysis pass.
...
llvm-svn: 48520
2008-03-19 00:48:41 +00:00
Devang Patel
811ca3ddba
Identify Analysis pass.
...
Do not run analysis pass again if analysis info is still available.
This fixes PR1441.
llvm-svn: 48476
2008-03-18 00:39:19 +00:00
Gordon Henriksen
caeafc4911
C and Objective Caml bindings for PassManagers.
...
llvm-svn: 48413
2008-03-16 04:20:44 +00:00
Gordon Henriksen
7ebaba8579
Expose Module::dump via C and Ocaml.
...
Patch by Erick Tryzelaar.
llvm-svn: 48379
2008-03-14 23:58:56 +00:00
Dan Gohman
37a26f973f
Update comments; getPassName no longer uses RTTI.
...
llvm-svn: 48369
2008-03-14 18:27:04 +00:00
Chris Lattner
a14cdebdd9
move a bunch of trivial methods to be inline.
...
llvm-svn: 48326
2008-03-13 05:00:21 +00:00
Chris Lattner
d4a9aafc3f
Various improvements suggested by Duncan
...
llvm-svn: 48325
2008-03-13 04:33:03 +00:00
Dan Gohman
e84a9f3740
Eliminate a few unnecessary uses of dynamic_cast.
...
llvm-svn: 48318
2008-03-13 02:08:36 +00:00
Dan Gohman
548e24d9ae
Fix a typo.
...
llvm-svn: 48317
2008-03-13 01:58:48 +00:00
Dan Gohman
971fdb877c
Don't redundantly clear std::vector members in destructors.
...
llvm-svn: 48316
2008-03-13 01:57:34 +00:00
Dan Gohman
abf6c9aa1d
Change PMTopLevelManager's PassManagers vector element type from
...
Pass* to PMDataManager*. PMDataManager is more specific than Pass,
so this more accurately describes the objects that are being stored.
This eliminates the need for several dynamic_casts to PMDataManager*.
It does introduce one dynamic_cast though, in dumpPasses(). Give
this one a comment describing why a dynamic_cast is being used.
llvm-svn: 48315
2008-03-13 01:48:32 +00:00
Dan Gohman
70f4b55e3f
Change PMStack::push to accept a PMDataManager* instead of
...
a Pass*. PMDataManager* is what it actually holds, so this
makes it clearer.
llvm-svn: 48314
2008-03-13 01:21:31 +00:00
Chris Lattner
7925cc72c0
Reimplement the parameter attributes support, phase #1 . hilights:
...
1. There is now a "PAListPtr" class, which is a smart pointer around
the underlying uniqued parameter attribute list object, and manages
its refcount. It is now impossible to mess up the refcount.
2. PAListPtr is now the main interface to the underlying object, and
the underlying object is now completely opaque.
3. Implementation details like SmallVector and FoldingSet are now no
longer part of the interface.
4. You can create a PAListPtr with an arbitrary sequence of
ParamAttrsWithIndex's, no need to make a SmallVector of a specific
size (you can just use an array or scalar or vector if you wish).
5. All the client code that had to check for a null pointer before
dereferencing the pointer is simplified to just access the
PAListPtr directly.
6. The interfaces for adding attrs to a list and removing them is a
bit simpler.
Phase #2 will rename some stuff (e.g. PAListPtr) and do other less
invasive changes.
llvm-svn: 48289
2008-03-12 17:45:29 +00:00
Anton Korobeynikov
38bc6e43f7
Add helper for ultimate aliasee resoltion
...
llvm-svn: 48255
2008-03-11 22:28:56 +00:00
Dan Gohman
2b0112a65a
Give PassManager and FunctionPassManager a common base class, with
...
add(Pass *) as a pure virtual member function. This will allow all
the various addPassesTo* functions in LLVM to avoid hard-coding what
type of PassManager is used.
llvm-svn: 48226
2008-03-11 16:41:42 +00:00
Dan Gohman
54b152cbbf
Fix typos in comments.
...
llvm-svn: 48225
2008-03-11 16:18:48 +00:00
Dan Gohman
13e8dd3b34
Use utostr instead of a stringstream.
...
llvm-svn: 48198
2008-03-10 23:55:07 +00:00
Dan Gohman
0b00b3b786
Initialize ArgTypes directly instead of manually copying in the elements.
...
llvm-svn: 48195
2008-03-10 23:41:23 +00:00
Dan Gohman
70ab77e185
Remove an unnecessary #include
...
llvm-svn: 48193
2008-03-10 23:37:12 +00:00
Nick Lewycky
5dd879d5b5
Turn unwind_to into "unwinds to".
...
llvm-svn: 48123
2008-03-10 02:20:00 +00:00
Nick Lewycky
c64eb33c52
Two things. Preserve the unwind_to when splitting a BB.
...
Add the ability to remove just one instance of a BB from a phi node. This fixes
the compile error in the tree now.
llvm-svn: 48085
2008-03-09 05:04:48 +00:00
Dan Gohman
8ff072e188
Remove unused runPass methods.
...
llvm-svn: 48044
2008-03-08 01:43:56 +00:00
Devang Patel
a97b000dcc
Check struct return type first.
...
llvm-svn: 47922
2008-03-05 00:27:05 +00:00
Devang Patel
a33f4b4cc7
Print types for all ret operands.
...
llvm-svn: 47911
2008-03-04 22:05:14 +00:00
Devang Patel
26d0fac377
Revert SmallVector ctor variants.
...
llvm-svn: 47908
2008-03-04 21:54:56 +00:00
Devang Patel
27426dedc0
Add FunctionType ctor variant that takes SmallVector params.
...
llvm-svn: 47895
2008-03-04 18:57:05 +00:00
Devang Patel
d0d7028a2b
s/isReturnStruct()/hasStructRetAttr()/g
...
llvm-svn: 47857
2008-03-03 21:46:28 +00:00
Devang Patel
f5e729f70b
If a function uses multive values in ret instruction then it
...
is returning a struct value.
llvm-svn: 47848
2008-03-03 18:58:16 +00:00
Chris Lattner
ffde7a642a
Add a new ShuffleVectorInst::getMaskValue method.
...
llvm-svn: 47813
2008-03-02 05:28:33 +00:00
Nick Lewycky
b02fe64d8b
Add an unwind_to field to basic blocks, making them Users instead of Values.
...
This is the first checkin for PR1269, the new EH infrastructure.
llvm-svn: 47802
2008-03-02 02:48:09 +00:00
Nick Lewycky
c0b361a17c
Print the name, not a pointer.
...
llvm-svn: 47796
2008-03-01 17:20:55 +00:00
Chris Lattner
64e101b2d9
Fix PR2113 by verifying allocations.
...
llvm-svn: 47792
2008-03-01 09:01:57 +00:00
Dan Gohman
3491cd8454
Use the new convertFromAPInt instead of convertFromZeroExtendedInteger.
...
llvm-svn: 47744
2008-02-29 01:42:52 +00:00
Devang Patel
351830e819
Remove dead code.
...
llvm-svn: 47700
2008-02-27 23:33:51 +00:00
Devang Patel
c68e26f9fe
Add comment.
...
llvm-svn: 47653
2008-02-27 01:20:54 +00:00
Devang Patel
98774b4b6a
Add assert to check return type.
...
llvm-svn: 47637
2008-02-26 22:55:21 +00:00
Devang Patel
5c00c6bafa
Remove unncessary ReturnInst constructors.
...
llvm-svn: 47633
2008-02-26 22:12:58 +00:00
Devang Patel
0be97b2118
Use SmallVector while constructing ReturnInst.
...
llvm-svn: 47619
2008-02-26 19:38:17 +00:00
Devang Patel
e5766a12da
Avoid const_casts
...
llvm-svn: 47616
2008-02-26 19:15:26 +00:00
Devang Patel
6d492c3caf
Remove unnecessary getOperand/setOperand overriders.
...
Simplify getReturnValue()
llvm-svn: 47614
2008-02-26 19:08:13 +00:00
Devang Patel
e0f9c6f281
Unify to ReturnInst::init() member functions.
...
llvm-svn: 47611
2008-02-26 18:49:29 +00:00
Devang Patel
b35d15edf9
Optimize most common case by using single RetVal in ReturnInst.
...
llvm-svn: 47607
2008-02-26 17:56:20 +00:00
Devang Patel
5b3d61f5ed
Pass const vectors by reference.
...
llvm-svn: 47577
2008-02-26 00:12:13 +00:00
Devang Patel
03a99197aa
print getresult operand and its type directly.
...
llvm-svn: 47514
2008-02-23 01:04:26 +00:00
Devang Patel
63d29fccdf
Use dyn_cast instead of isa + cast.
...
llvm-svn: 47511
2008-02-23 00:47:00 +00:00
Devang Patel
f674975a65
To support multiple return values, now ret instruction supports multiple operands instead of one aggregate operand.
...
llvm-svn: 47508
2008-02-23 00:35:18 +00:00
Dale Johannesen
ae08bdb4cf
Split ParameterAttributes.h, putting the complicated
...
stuff into ParamAttrsList.h. Per feedback from
ParamAttrs changes.
llvm-svn: 47504
2008-02-22 22:17:59 +00:00
Dale Johannesen
a96eb3a1d8
Pass alignment on ByVal parameters, from FE, all
...
the way through. It is now used for codegen.
llvm-svn: 47484
2008-02-22 17:49:45 +00:00
Devang Patel
066973767f
Print getresult instruction properly.
...
llvm-svn: 47473
2008-02-22 03:10:23 +00:00
Devang Patel
2754d59c53
Print ret instruction that returns aggregates.
...
llvm-svn: 47472
2008-02-22 02:50:49 +00:00
Devang Patel
c5dccfdd74
print getresult instruction.
...
llvm-svn: 47461
2008-02-21 23:02:20 +00:00
Devang Patel
298b5f1d6c
Use isa<> instead of getTypeID() to check StructType.
...
llvm-svn: 47460
2008-02-21 22:24:17 +00:00
Devang Patel
e60ebc7744
Let invoke return aggregate value.
...
llvm-svn: 47425
2008-02-21 02:14:01 +00:00
Devang Patel
702c4a60a6
Let function call return aggregate.
...
Now, we have very first multiple return value testcase!
llvm-svn: 47424
2008-02-21 01:54:02 +00:00
Devang Patel
d2142aeb44
What if functions can return aggregate values ?
...
One small step towards multiple return value support.
llvm-svn: 47406
2008-02-20 22:36:03 +00:00
Devang Patel
4034343b67
getresult does not support nested aggregates.
...
llvm-svn: 47396
2008-02-20 19:39:41 +00:00
Devang Patel
f114189912
Verifier should use Assert1 instead of assert.
...
llvm-svn: 47394
2008-02-20 19:32:20 +00:00
Devang Patel
de35f122f2
getresult type is the type of indexed aggregate element
...
llvm-svn: 47392
2008-02-20 19:26:55 +00:00
Devang Patel
6266d7147e
Specify GetResultInst index as an unsigned.
...
llvm-svn: 47390
2008-02-20 19:10:47 +00:00
Devang Patel
019b5585e8
Use isValidOperands() to verify GetResultInst.
...
llvm-svn: 47387
2008-02-20 18:36:46 +00:00
Anton Korobeynikov
c41f5b6af4
Fix newly-introduced 4.3 warnings
...
llvm-svn: 47375
2008-02-20 12:07:57 +00:00
Anton Korobeynikov
0c5e186924
Unbreak build with gcc 4.3: provide missed includes and silence most annoying warnings.
...
llvm-svn: 47367
2008-02-20 11:08:44 +00:00
Dale Johannesen
7eccf11cfb
Add Alignment field to ParameterAttributes and
...
treat more or less rationally in interface
functions, subject to change. No functional change.
llvm-svn: 47352
2008-02-19 23:51:49 +00:00
Devang Patel
a74d2cbb6f
Add GetResultInst. First step for multiple return value support.
...
llvm-svn: 47348
2008-02-19 22:15:16 +00:00
Dale Johannesen
ecb2b233b1
Expand ParameterAttributes to 32 bits (in preparation
...
for adding alignment info, not there yet). Clean up
interfaces to reference ParameterAttributes consistently.
llvm-svn: 47342
2008-02-19 21:38:47 +00:00
Chris Lattner
85482657eb
Fix some minor issues folding undef, PR2052
...
llvm-svn: 47314
2008-02-19 06:22:12 +00:00
Duncan Sands
a85448506d
Simplify caller updating using a CallSite, as
...
requested by Chris. While there, do the same
for an existing function committed by someone
called "lattner" :)
llvm-svn: 47273
2008-02-18 17:32:13 +00:00
Owen Anderson
e4e1706f95
I got the predicate backwards in my last patch. The comment is correct, the code was not.
...
llvm-svn: 47264
2008-02-18 09:22:21 +00:00
Owen Anderson
18a7d290cb
Duncan pointed out that we can fast fail here, because the sret parameter of
...
a function must be the first parameter.
llvm-svn: 47254
2008-02-18 04:06:26 +00:00
Owen Anderson
48dd6a0f96
Add a predicate to Argument to check for the StructRet attribute.
...
llvm-svn: 47248
2008-02-17 23:22:28 +00:00
Duncan Sands
753597d1cf
Some micro-optimizations.
...
llvm-svn: 47219
2008-02-16 20:53:06 +00:00
Chris Lattner
bab03a1b50
targets that support quotes for mangled names still need to escape newlines
...
when they occur in the name, just like " is escaped.
llvm-svn: 47169
2008-02-15 18:54:56 +00:00
Chris Lattner
22696c10f0
check that terminators only occur at the end of a block. This catches the
...
common problem of putting two terminators in the same block. I can't write
a testcase for this because the .ll parser rejects this before the verifier
can, but this can occur when generating IR.
llvm-svn: 46900
2008-02-09 01:06:01 +00:00
Dan Gohman
b4aa0b2a15
Fix a typo in a comment.
...
llvm-svn: 46836
2008-02-07 02:30:40 +00:00
Devang Patel
cad20dbdb0
Add comment explaining what is lower level analysis pass.
...
llvm-svn: 46658
2008-02-02 01:43:30 +00:00
Gordon Henriksen
b75d9e974d
Fixing a bug creating floating point constants of type other
...
than double through the C bindings. Thanks to Tomas Lindquist
Olsen for reporting it.
llvm-svn: 46656
2008-02-02 01:07:50 +00:00
Dan Gohman
241714222a
Fix 80-col violations.
...
llvm-svn: 46510
2008-01-29 12:09:55 +00:00
Dan Gohman
522401f26e
Add explicit keywords.
...
llvm-svn: 46506
2008-01-29 11:36:12 +00:00
Nick Lewycky
6b070b1b93
Handle some more combinations of extend and icmp. Fixes PR1940.
...
llvm-svn: 46431
2008-01-28 03:48:02 +00:00
Chris Lattner
5740a10d2c
Add hasByValAttr() and hasNoAliasAttr() methods to the Argument class.
...
llvm-svn: 46314
2008-01-24 17:47:11 +00:00
Duncan Sands
fe83650649
It turns out that in C++ it is legal to declare functions
...
that return an opaque type by value, as long as you don't
call it or provide a body (you can take the address of it).
So it is wrong to insist that sret parameters not be an
opaque*. And I guess it is really up to codegen to complain
if someone tries to call such a function. I'm also removing
the analogous check from byval parameters, since I don't
see why we shouldn't allow them as long as no-one tries to
call the function or give it a body.
llvm-svn: 46216
2008-01-21 21:37:41 +00:00
Duncan Sands
50df31d59a
Check that sret is only used on pointers to types
...
with a size, like byval.
llvm-svn: 46207
2008-01-21 11:28:49 +00:00
Duncan Sands
26de25066c
Be consistent with other attribute methods, and
...
check the callee also if it is known.
llvm-svn: 46206
2008-01-21 11:27:55 +00:00
Chris Lattner
2595fd0ca7
improve compatibility with mingw, patch by Alain Frisch
...
llvm-svn: 46026
2008-01-15 22:50:50 +00:00
Bill Wendling
0ad07f292c
Reformatted. It was confusing the other way. No functionality change.
...
llvm-svn: 46009
2008-01-15 21:16:32 +00:00
Duncan Sands
087d6020ee
Simplify CallInst::hasByValArgument using a new method.
...
llvm-svn: 45974
2008-01-14 19:57:00 +00:00
Duncan Sands
81e35b4d47
I noticed that the trampoline straightening transformation could
...
drop attributes on varargs call arguments. Also, it could generate
invalid IR if the transformed call already had the 'nest' attribute
somewhere (this can never happen for code coming from llvm-gcc,
but it's a theoretical possibility). Fix both problems.
llvm-svn: 45973
2008-01-14 19:52:09 +00:00
Evan Cheng
12fb1dc67e
Simplify code.
...
llvm-svn: 45950
2008-01-14 02:38:45 +00:00
Duncan Sands
86c17f2ebf
Allow the byval attribute for pointers to any type with
...
a size, not just structs.
llvm-svn: 45938
2008-01-13 21:19:12 +00:00
Evan Cheng
a5183224b0
Add hasByValArgument() to test if a call instruction has byval argument(s).
...
llvm-svn: 45913
2008-01-12 18:57:32 +00:00
Duncan Sands
3b617cbe30
Be more liberal in what parameter attributes are
...
allowed on the vararg arguments of a call.
llvm-svn: 45909
2008-01-12 16:42:01 +00:00
Duncan Sands
e55a5806ac
Do not allow attributes beyond a function's last
...
parameter, even if it is a varargs function. Do
allow attributes on the varargs part of a call,
but not beyond the last argument. Only allow
selected attributes to be on the varargs part of
a call (currently only 'byval' is allowed). The
reasoning here is that most attributes, eg inreg,
simply make no sense here.
llvm-svn: 45887
2008-01-11 22:36:48 +00:00
Evan Cheng
63753b7be7
Allow parameter attributes on varargs function parameters.
...
llvm-svn: 45850
2008-01-11 02:13:09 +00:00
Duncan Sands
7955cf0cd7
Small cleanup for handling of type/parameter attribute
...
incompatibility.
llvm-svn: 45704
2008-01-07 17:16:06 +00:00
Duncan Sands
fd975e4b3d
The transform that tries to turn calls to bitcast functions into
...
direct calls bails out unless caller and callee have essentially
equivalent parameter attributes. This is illogical - the callee's
attributes should be of no relevance here. Rework the logic, which
incidentally fixes a crash when removed arguments have attributes.
llvm-svn: 45658
2008-01-06 18:27:01 +00:00
Duncan Sands
b8489f09a2
When transforming a call to a bitcast function into
...
a direct call with cast parameters and cast return
value (if any), instcombine was prepared to cast any
non-void return value into any other, whether castable
or not. Add a new predicate for testing whether casting
is valid, and check it both for the return value and
(as a cleanup) for the parameters.
llvm-svn: 45657
2008-01-06 10:12:28 +00:00
Gordon Henriksen
8e4ae9a345
Trying that again.
...
llvm-svn: 45529
2008-01-03 03:32:33 +00:00
Gordon Henriksen
b28803a63f
Fix a compile error on Windows.
...
llvm-svn: 45528
2008-01-03 03:21:18 +00:00
Chris Lattner
c613164542
Remove the function attr cache for intrinsics. This does not maintain the
...
refcount on these correctly, and can end up referring to deleted
attributes. This fixes PR1881.
llvm-svn: 45525
2008-01-03 01:20:12 +00:00
Chris Lattner
e54252e6e1
Don't create a new ParamAttrsList (which copies the vector) just to
...
get a profile.
llvm-svn: 45524
2008-01-03 00:29:27 +00:00
Chris Lattner
e14d4d026e
move some code out of line, rearrange a bit.
...
llvm-svn: 45519
2008-01-03 00:10:22 +00:00
Chris Lattner
9ec341b120
Split param attr implementation out from Function.cpp into its
...
own file. Don't #include ParameterAttributes.h into any major
public header files: just move methods out of line as appropriate.
llvm-svn: 45517
2008-01-02 23:42:30 +00:00
Chris Lattner
25b9530d7b
remove blob of #if'd out code.
...
llvm-svn: 45512
2008-01-02 23:10:45 +00:00
Chris Lattner
93a70c4a0e
Fix a build issue on cygwin
...
llvm-svn: 45506
2008-01-02 22:03:27 +00:00
Gordon Henriksen
d2485b2cec
Adding C bindings for SwitchInst::addCase.
...
Patch by Bryan O'Sullivan!
llvm-svn: 45481
2008-01-01 05:50:53 +00:00
Gordon Henriksen
8082358f86
Add some doxygen comments to llvm-c/Core.h.
...
llvm-svn: 45450
2007-12-30 17:46:33 +00:00
Chris Lattner
ad9a6ccb83
Remove attribution from file headers, per discussion on llvmdev.
...
llvm-svn: 45418
2007-12-29 20:36:04 +00:00
Chris Lattner
8193d4af33
remove attribution from lib Makefiles.
...
llvm-svn: 45415
2007-12-29 20:09:26 +00:00
Gordon Henriksen
86e98275ff
Adding bindings for target triple and data layout.
...
llvm-svn: 45369
2007-12-27 20:13:47 +00:00
Gordon Henriksen
d96b3222e5
Switch the bindings to use LLVMFoldingBuilder.
...
llvm-svn: 45367
2007-12-27 18:25:59 +00:00
Gordon Henriksen
a9f4ed4070
Noting and enforcing that GC intrinsics are valid only within a
...
function with GC.
This will catch the error when the inliner inlines a function with
GC into a caller with no GC.
llvm-svn: 45350
2007-12-25 02:31:26 +00:00
Gordon Henriksen
44841db057
Adjusting verification of "llvm.gc*" intrinsic prototypes to match
...
LangRef.
llvm-svn: 45349
2007-12-25 02:02:10 +00:00
Duncan Sands
bc10247769
Get the verifier to check attributes on calls as well
...
as on functions. Make it verify invokes and not just
ordinary calls. As a (desired) side-effect, it is no
longer legal to have call attributes on arguments that
are being passed to the varargs part of a varargs
function (llvm-as drops them on the floor anyway).
llvm-svn: 45286
2007-12-21 19:19:01 +00:00
Gordon Henriksen
46137f1e2e
Adding bindings for memory buffers and module providers. Switching
...
to exceptions rather than variants for error handling in Ocaml.
llvm-svn: 45226
2007-12-19 22:30:40 +00:00
Duncan Sands
56f3add5b7
When inlining through an 'nounwind' call, mark inlined
...
calls 'nounwind'. It is important for correct C++
exception handling that nounwind markings do not get
lost, so this transformation is actually needed for
correctness.
llvm-svn: 45218
2007-12-19 21:13:37 +00:00
Chris Lattner
fabeb5e6c1
remove a dead annotation
...
llvm-svn: 45163
2007-12-18 19:04:24 +00:00
Duncan Sands
242f80be86
Rename isNoReturn to doesNotReturn, and isNoUnwind to
...
doesNotThrow.
llvm-svn: 45160
2007-12-18 09:59:50 +00:00
Christopher Lamb
efdf2791b2
Don't forget to print address space qualifiers when printing out the type table! Thanks to Gordon Henriksen for pointing this out.
...
llvm-svn: 45147
2007-12-18 03:49:35 +00:00