From lattner at cs.uiuc.edu Mon Mar 8 00:11:06 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:11:06 2004
Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y
Message-ID: <200403080610.AAA04161@zion.cs.uiuc.edu>
Changes in directory llvm/lib/AsmParser:
llvmAsmParser.y updated: 1.156 -> 1.157
---
Log message:
Eliminate a REALLY HORRIBLE API: mutateReferences, which is gross gross gross.
---
Diffs of the changes: (+7 -5)
Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.156 llvm/lib/AsmParser/llvmAsmParser.y:1.157
--- llvm/lib/AsmParser/llvmAsmParser.y:1.156 Mon Feb 9 15:03:38 2004
+++ llvm/lib/AsmParser/llvmAsmParser.y Mon Mar 8 00:09:57 2004
@@ -73,7 +73,7 @@
// here. This is used for forward references of ConstantPointerRefs.
//
typedef std::map, GlobalVariable*> GlobalRefsType;
+ ValID>, GlobalValue*> GlobalRefsType;
GlobalRefsType GlobalRefs;
void ModuleDone() {
@@ -114,7 +114,7 @@
GlobalRefs.find(std::make_pair(GV->getType(), D));
if (I != GlobalRefs.end()) {
- GlobalVariable *OldGV = I->second; // Get the placeholder...
+ GlobalValue *OldGV = I->second; // Get the placeholder...
I->first.second.destroy(); // Free string memory if necessary
// Loop over all of the uses of the GlobalValue. The only thing they are
@@ -125,12 +125,14 @@
// Change the const pool reference to point to the real global variable
// now. This should drop a use from the OldGV.
- CPR->mutateReferences(OldGV, GV);
+ CPR->replaceUsesOfWithOnConstant(OldGV, GV);
assert(OldGV->use_empty() && "All uses should be gone now!");
// Remove OldGV from the module...
- CurrentModule->getGlobalList().remove(OldGV);
- delete OldGV; // Delete the old placeholder
+ if (GlobalVariable *GVar = dyn_cast(OldGV))
+ CurrentModule->getGlobalList().erase(GVar);
+ else
+ CurrentModule->getFunctionList().erase(cast(OldGV));
// Remove the map entry for the global now that it has been created...
GlobalRefs.erase(I);
From lattner at cs.uiuc.edu Mon Mar 8 00:11:11 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:11:11 2004
Subject: [llvm-commits] CVS: llvm/include/llvm/Constant.h
Message-ID: <200403080610.AAA04178@zion.cs.uiuc.edu>
Changes in directory llvm/include/llvm:
Constant.h updated: 1.12 -> 1.13
---
Log message:
remove *THANKFULLY* dead method
---
Diffs of the changes: (+0 -6)
Index: llvm/include/llvm/Constant.h
diff -u llvm/include/llvm/Constant.h:1.12 llvm/include/llvm/Constant.h:1.13
--- llvm/include/llvm/Constant.h:1.12 Tue Nov 11 16:41:29 2003
+++ llvm/include/llvm/Constant.h Mon Mar 8 00:10:32 2004
@@ -85,12 +85,6 @@
"implemented for all constants that have operands!");
assert(0 && "Constants that do not have operands cannot be using 'From'!");
}
-
- // WARNING: Only to be used by Bytecode & Assembly Parsers! USER CODE SHOULD
- // NOT USE THIS!!
- // Returns the number of uses of OldV that were replaced.
- unsigned mutateReferences(Value* OldV, Value *NewV);
- // END WARNING!!
};
} // End llvm namespace
From lattner at cs.uiuc.edu Mon Mar 8 00:12:01 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:12:01 2004
Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp
Message-ID: <200403080611.AAA04191@zion.cs.uiuc.edu>
Changes in directory llvm/lib/VMCore:
Constants.cpp updated: 1.80 -> 1.81
---
Log message:
Eliminate nightmarish API
---
Diffs of the changes: (+0 -23)
Index: llvm/lib/VMCore/Constants.cpp
diff -u llvm/lib/VMCore/Constants.cpp:1.80 llvm/lib/VMCore/Constants.cpp:1.81
--- llvm/lib/VMCore/Constants.cpp:1.80 Mon Feb 16 14:46:13 2004
+++ llvm/lib/VMCore/Constants.cpp Mon Mar 8 00:11:10 2004
@@ -1119,26 +1119,3 @@
const char *ConstantExpr::getOpcodeName() const {
return Instruction::getOpcodeName(getOpcode());
}
-
-unsigned Constant::mutateReferences(Value *OldV, Value *NewV) {
- // Uses of constant pointer refs are global values, not constants!
- if (ConstantPointerRef *CPR = dyn_cast(this)) {
- GlobalValue *NewGV = cast(NewV);
- GlobalValue *OldGV = CPR->getValue();
-
- assert(OldGV == OldV && "Cannot mutate old value if I'm not using it!");
- Operands[0] = NewGV;
- OldGV->getParent()->mutateConstantPointerRef(OldGV, NewGV);
- return 1;
- } else {
- Constant *NewC = cast(NewV);
- unsigned NumReplaced = 0;
- for (unsigned i = 0, N = getNumOperands(); i != N; ++i)
- if (Operands[i] == OldV) {
- ++NumReplaced;
- Operands[i] = NewC;
- }
- return NumReplaced;
- }
-}
-
From lattner at cs.uiuc.edu Mon Mar 8 00:16:01 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:16:01 2004
Subject: [llvm-commits] CVS: llvm/include/llvm/Module.h
Message-ID: <200403080615.AAA06058@zion.cs.uiuc.edu>
Changes in directory llvm/include/llvm:
Module.h updated: 1.42 -> 1.43
---
Log message:
Remove Module::mutateConstantPointerRef, which is now thankfully dead!
---
Diffs of the changes: (+0 -1)
Index: llvm/include/llvm/Module.h
diff -u llvm/include/llvm/Module.h:1.42 llvm/include/llvm/Module.h:1.43
--- llvm/include/llvm/Module.h:1.42 Sun Feb 29 19:25:37 2004
+++ llvm/include/llvm/Module.h Mon Mar 8 00:15:33 2004
@@ -77,7 +77,6 @@
// Accessor for the underlying GVRefMap... only through the Constant class...
friend class Constant;
friend class ConstantPointerRef;
- void mutateConstantPointerRef(GlobalValue *OldGV, GlobalValue *NewGV);
ConstantPointerRef *getConstantPointerRef(GlobalValue *GV);
void destroyConstantPointerRef(ConstantPointerRef *CPR);
From lattner at cs.uiuc.edu Mon Mar 8 00:17:03 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:17:03 2004
Subject: [llvm-commits] CVS: llvm/lib/VMCore/Module.cpp
Message-ID: <200403080616.AAA06381@zion.cs.uiuc.edu>
Changes in directory llvm/lib/VMCore:
Module.cpp updated: 1.47 -> 1.48
---
Log message:
Remove Module::mutateConstantPointerRef, which is now thankfully dead!
This is one small step towards the complete obliteration of
ConstantPointerRef's entirely!! Woot!
---
Diffs of the changes: (+0 -25)
Index: llvm/lib/VMCore/Module.cpp
diff -u llvm/lib/VMCore/Module.cpp:1.47 llvm/lib/VMCore/Module.cpp:1.48
--- llvm/lib/VMCore/Module.cpp:1.47 Wed Dec 31 02:43:01 2003
+++ llvm/lib/VMCore/Module.cpp Mon Mar 8 00:16:10 2004
@@ -335,28 +335,3 @@
GVRefMap = 0;
}
}
-
-void Module::mutateConstantPointerRef(GlobalValue *OldGV, GlobalValue *NewGV) {
- assert(OldGV != NewGV && "Cannot mutate to the same global!");
- GlobalValueRefMap::iterator I = GVRefMap->Map.find(OldGV);
- assert(I != GVRefMap->Map.end() &&
- "mutateConstantPointerRef; OldGV not in table!");
- ConstantPointerRef *Ref = I->second;
-
- // Remove the old entry...
- GVRefMap->Map.erase(I);
-
- // Check to see if a CPR already exists for NewGV
- I = GVRefMap->Map.lower_bound(NewGV);
-
- if (I == GVRefMap->Map.end() || I->first != NewGV) {
- // Insert the new entry...
- GVRefMap->Map.insert(I, std::make_pair(NewGV, Ref));
- } else {
- // Otherwise, an entry already exists for the current global value.
- // Completely replace the old CPR with the existing one...
- Ref->replaceAllUsesWith(I->second);
- delete Ref;
- }
-}
-
From lattner at cs.uiuc.edu Mon Mar 8 00:18:01 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:18:01 2004
Subject: [llvm-commits] CVS: llvm/test/Regression/Assembler/2004-03-07-FunctionAddressAlignment.llx
Message-ID: <200403080617.AAA06413@zion.cs.uiuc.edu>
Changes in directory llvm/test/Regression/Assembler:
2004-03-07-FunctionAddressAlignment.llx added (r1.1)
---
Log message:
New testcase for folding in some important situations. The first two
come up a lot in the code generated by the C++ front-end for pointers
to member functions. See PR166.
---
Diffs of the changes: (+15 -0)
Index: llvm/test/Regression/Assembler/2004-03-07-FunctionAddressAlignment.llx
diff -c /dev/null llvm/test/Regression/Assembler/2004-03-07-FunctionAddressAlignment.llx:1.1
*** /dev/null Mon Mar 8 00:17:25 2004
--- llvm/test/Regression/Assembler/2004-03-07-FunctionAddressAlignment.llx Mon Mar 8 00:17:15 2004
***************
*** 0 ****
--- 1,15 ----
+ ; RUN: llvm-as < %s | llvm-dis | not grep cast
+ ; All of these should be eliminable
+
+
+ int %foo() {
+ ret int and (int cast (int()* %foo to int), int 1)
+ }
+
+ int %foo2() {
+ ret int and (int 1, int cast (int()* %foo2 to int))
+ }
+
+ bool %foo3() {
+ ret bool cast (bool()* %foo3 to bool)
+ }
From lattner at cs.uiuc.edu Mon Mar 8 00:18:03 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 00:18:03 2004
Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFolding.cpp
Message-ID: <200403080617.AAA06426@zion.cs.uiuc.edu>
Changes in directory llvm/lib/VMCore:
ConstantFolding.cpp updated: 1.53 -> 1.54
---
Log message:
Implement test/Regression/Assembler/2004-03-07-FunctionAddressAlignment.llx
---
Diffs of the changes: (+20 -0)
Index: llvm/lib/VMCore/ConstantFolding.cpp
diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.53 llvm/lib/VMCore/ConstantFolding.cpp:1.54
--- llvm/lib/VMCore/ConstantFolding.cpp:1.53 Sun Feb 22 00:25:38 2004
+++ llvm/lib/VMCore/ConstantFolding.cpp Mon Mar 8 00:17:35 2004
@@ -22,6 +22,7 @@
#include "llvm/Constants.h"
#include "llvm/Instructions.h"
#include "llvm/DerivedTypes.h"
+#include "llvm/Function.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include
using namespace llvm;
@@ -523,6 +524,15 @@
const Type *DestTy) {
if (V->getType() == DestTy) return (Constant*)V;
+ // Cast of a global address to boolean is always true.
+ if (const ConstantPointerRef *CPR = dyn_cast(V))
+ if (DestTy == Type::BoolTy)
+ // FIXME: When we support 'external weak' references, we have to prevent
+ // this transformation from happening. In the meantime we avoid folding
+ // any cast of an external symbol.
+ if (!CPR->getValue()->isExternal())
+ return ConstantBool::True;
+
if (const ConstantExpr *CE = dyn_cast(V))
if (CE->getOpcode() == Instruction::Cast) {
Constant *Op = const_cast(CE->getOperand(0));
@@ -873,6 +883,16 @@
if (cast(V2)->isAllOnesValue())
return const_cast(V1); // X & -1 == X
if (V2->isNullValue()) return const_cast(V2); // X & 0 == 0
+ if (CE1->getOpcode() == Instruction::Cast &&
+ isa(CE1->getOperand(0))) {
+ ConstantPointerRef *CPR =cast(CE1->getOperand(0));
+
+ // Functions are at least 4-byte aligned. If and'ing the address of a
+ // function with a constant < 4, fold it to zero.
+ if (const ConstantInt *CI = dyn_cast(V2))
+ if (CI->getRawValue() < 4 && isa(CPR->getValue()))
+ return Constant::getNullValue(CI->getType());
+ }
break;
case Instruction::Or:
if (V2->isNullValue()) return const_cast(V1); // X | 0 == X
From criswell at cs.uiuc.edu Mon Mar 8 09:11:05 2004
From: criswell at cs.uiuc.edu (John Criswell)
Date: Mon Mar 8 09:11:05 2004
Subject: [llvm-commits] CVS: poolalloc/test/TEST.poolalloc.Makefile
Message-ID: <200403081510.JAA10213@choi.cs.uiuc.edu>
Changes in directory poolalloc/test:
TEST.poolalloc.Makefile updated: 1.22 -> 1.23
---
Log message:
Fix comment regarding the heuristic options.
---
Diffs of the changes: (+1 -1)
Index: poolalloc/test/TEST.poolalloc.Makefile
diff -u poolalloc/test/TEST.poolalloc.Makefile:1.22 poolalloc/test/TEST.poolalloc.Makefile:1.23
--- poolalloc/test/TEST.poolalloc.Makefile:1.22 Fri Mar 5 15:36:53 2004
+++ poolalloc/test/TEST.poolalloc.Makefile Mon Mar 8 09:10:04 2004
@@ -10,7 +10,7 @@
EXTRA_PA_FLAGS := -poolalloc-force-simple-pool-init
# HEURISTIC can be set to:
-# AllPools
+# AllNodes
ifdef HEURISTIC
EXTRA_PA_FLAGS += -poolalloc-heuristic=$(HEURISTIC)
endif
From lattner at cs.uiuc.edu Mon Mar 8 10:15:01 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 10:15:01 2004
Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y
Message-ID: <200403081614.KAA29075@zion.cs.uiuc.edu>
Changes in directory llvm/lib/AsmParser:
llvmAsmParser.y updated: 1.157 -> 1.158
---
Log message:
Insert functions into the module promptly, not lazily. This fixes a bug
I introduced last night. Note to self: test the *correct* tree...
---
Diffs of the changes: (+2 -11)
Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.157 llvm/lib/AsmParser/llvmAsmParser.y:1.158
--- llvm/lib/AsmParser/llvmAsmParser.y:1.157 Mon Mar 8 00:09:57 2004
+++ llvm/lib/AsmParser/llvmAsmParser.y Mon Mar 8 10:14:19 2004
@@ -1295,8 +1295,6 @@
//
FunctionList : FunctionList Function {
$$ = $1;
- assert($2->getParent() == 0 && "Function already in module!");
- $1->getFunctionList().push_back($2);
CurFun.FunctionDone();
}
| FunctionList FunctionProto {
@@ -1471,18 +1469,13 @@
if (!CurFun.isDeclare && !Fn->isExternal())
ThrowException("Redefinition of function '" + FunctionName + "'!");
- // If we found a preexisting function prototype, remove it from the
- // module, so that we don't get spurious conflicts with global & local
- // variables.
- //
- CurModule.CurrentModule->getFunctionList().remove(Fn);
-
// Make sure to strip off any argument names so we can't get conflicts...
for (Function::aiterator AI = Fn->abegin(), AE = Fn->aend(); AI != AE; ++AI)
AI->setName("");
} else { // Not already defined?
- Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName);
+ Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+ CurModule.CurrentModule);
InsertValue(Fn, CurModule.Values);
CurModule.DeclareNewGlobalValue(Fn, ValID::create($2));
}
@@ -1534,8 +1527,6 @@
FunctionProto : DECLARE { CurFun.isDeclare = true; } FunctionHeaderH {
$$ = CurFun.CurrentFunction;
- assert($$->getParent() == 0 && "Function already in module!");
- CurModule.CurrentModule->getFunctionList().push_back($$);
CurFun.FunctionDone();
};
From lattner at cs.uiuc.edu Mon Mar 8 10:47:04 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 10:47:04 2004
Subject: [llvm-commits] CVS: llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp
Message-ID: <200403081646.KAA02615@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Transforms/Instrumentation:
EmitFunctions.cpp updated: 1.16 -> 1.17
---
Log message:
finegrainify namespacification
---
Diffs of the changes: (+14 -14)
Index: llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp
diff -u llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.16 llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.17
--- llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.16 Sat Feb 14 22:07:26 2004
+++ llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp Mon Mar 8 10:45:53 2004
@@ -7,7 +7,9 @@
//
//===----------------------------------------------------------------------===//
//
-// This inserts a global constant table with function pointers all along
+// This inserts a global constant table with function pointers all along.
+//
+// NOTE: This pass is used by the reoptimizer only.
//
//===----------------------------------------------------------------------===//
@@ -16,24 +18,24 @@
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/CFG.h"
-
-namespace llvm {
-
-enum Color{
- WHITE,
- GREY,
- BLACK
-};
+using namespace llvm;
namespace {
+ enum Color{
+ WHITE,
+ GREY,
+ BLACK
+ };
+
struct EmitFunctionTable : public Pass {
bool run(Module &M);
};
- RegisterOpt X("emitfuncs", "Emit a Function Table");
+ RegisterOpt
+ X("emitfuncs", "Emit a function table for the reoptimizer");
}
-char doDFS(BasicBlock * node,std::map &color){
+static char doDFS(BasicBlock * node,std::map &color){
color[node] = GREY;
for(succ_iterator vl = succ_begin(node), ve = succ_end(node); vl != ve; ++vl){
@@ -56,7 +58,7 @@
return 1;
}
-char hasBackEdge(Function *F){
+static char hasBackEdge(Function *F){
std::map color;
return doDFS(F->begin(), color);
}
@@ -106,5 +108,3 @@
M.getGlobalList().push_back(fnCount);
return true; // Always modifies program
}
-
-} // End llvm namespace
From criswell at cs.uiuc.edu Mon Mar 8 10:47:07 2004
From: criswell at cs.uiuc.edu (John Criswell)
Date: Mon Mar 8 10:47:07 2004
Subject: [llvm-commits] CVS: llvm/test/Programs/MultiSource/Applications/hbd/Makefile
Message-ID: <200403081646.KAA14653@choi.cs.uiuc.edu>
Changes in directory llvm/test/Programs/MultiSource/Applications/hbd:
Makefile updated: 1.1 -> 1.2
---
Log message:
Specify full pathname of the input file.
---
Diffs of the changes: (+1 -1)
Index: llvm/test/Programs/MultiSource/Applications/hbd/Makefile
diff -u llvm/test/Programs/MultiSource/Applications/hbd/Makefile:1.1 llvm/test/Programs/MultiSource/Applications/hbd/Makefile:1.2
--- llvm/test/Programs/MultiSource/Applications/hbd/Makefile:1.1 Fri Feb 27 12:06:47 2004
+++ llvm/test/Programs/MultiSource/Applications/hbd/Makefile Mon Mar 8 10:46:22 2004
@@ -3,6 +3,6 @@
CPPFLAGS += -DHAVE_CONFIG_H
LDFLAGS += -lstdc++
LIBS += -lstdc++
-RUN_OPTIONS = Sort.class
+RUN_OPTIONS = $(BUILD_SRC_DIR)/Sort.class
REQUIRES_EH_SUPPORT := 1
include ../../Makefile.multisrc
From lattner at cs.uiuc.edu Mon Mar 8 10:50:02 2004
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon Mar 8 10:50:02 2004
Subject: [llvm-commits] CVS: llvm/docs/LangRef.html
Message-ID: <200403081649.KAA05412@zion.cs.uiuc.edu>
Changes in directory llvm/docs:
LangRef.html updated: 1.51 -> 1.52
---
Log message:
Remove the comment "Constants must always have an initial value.", which
is incorrect. Fix some formatting nastiness.
---
Diffs of the changes: (+41 -25)
Index: llvm/docs/LangRef.html
diff -u llvm/docs/LangRef.html:1.51 llvm/docs/LangRef.html:1.52
--- llvm/docs/LangRef.html:1.51 Mon Mar 1 11:47:27 2004
+++ llvm/docs/LangRef.html Mon Mar 8 10:49:10 2004
@@ -623,45 +623,61 @@
outside of the current module. It is illegal for a function declaration
to have any linkage type other than "externally visible".
+
-
+
+
+
Global variables define regions of memory allocated at compilation
time instead of run-time. Global variables may optionally be
initialized. A variable may be defined as a global "constant", which
indicates that the contents of the variable will never be modified
-(opening options for optimization). Constants must always have an
-initial value.
+(opening options for optimization).
+
As SSA values, global variables define pointer values that are in
scope (i.e. they dominate) for all basic blocks in the program. Global
variables always define a pointer to their "content" type because they
describe a region of memory, and all memory objects in LLVM are
accessed through pointers.
+
+
+
-
+
+
-
LLVM function definitions are composed of a (possibly empty)
-argument list, an opening curly brace, a list of basic blocks, and a
-closing curly brace. LLVM function declarations are defined with the "declare"
-keyword, a function name, and a function signature.
-
A function definition contains a list of basic blocks, forming the
-CFG for the function. Each basic block may optionally start with a
-label (giving the basic block a symbol table entry), contains a list of
-instructions, and ends with a terminator
-instruction (such as a branch or function return).
-
The first basic block in program is special in two ways: it is
-immediately executed on entrance to the function, and it is not allowed
-to have predecessor basic blocks (i.e. there can not be any branches to
-the entry block of a function). Because the block can have no
-predecessors, it also cannot have any PHI nodes.
-
-LLVM functions are identified by their name and type signature. Hence, two
-functions with the same name but different parameter lists or return values
-are considered different functions, and LLVM will resolves references to each
-appropriately.
-
+
+
LLVM function definitions are composed of a (possibly empty) argument list,
+an opening curly brace, a list of basic blocks, and a closing curly brace. LLVM
+function declarations are defined with the "declare" keyword, a
+function name, and a function signature.
+
+
A function definition contains a list of basic blocks, forming the CFG for
+the function. Each basic block may optionally start with a label (giving the
+basic block a symbol table entry), contains a list of instructions, and ends
+with a terminator instruction (such as a branch or
+function return).
+
+
The first basic block in program is special in two ways: it is immediately
+executed on entrance to the function, and it is not allowed to have predecessor
+basic blocks (i.e. there can not be any branches to the entry block of a
+function). Because the block can have no predecessors, it also cannot have any
+PHI nodes.
+
+
LLVM functions are identified by their name and type signature. Hence, two
+functions with the same name but different parameter lists or return values are
+considered different functions, and LLVM will resolves references to each
+appropriately.
+
+
+
@@ -2058,7 +2074,7 @@
Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2004/03/01 17:47:27 $
+ Last modified: $Date: 2004/03/08 16:49:10 $