[llvm-commits] [llvm-gcc] llvm-gcc patch for PR1373 (review only)
Zhou Sheng
zhousheng00 at gmail.com
Mon Jun 25 08:57:50 PDT 2007
Hi All,
Here is the llvm-gcc patch for PR1373. It makes llvm-gcc to emit noalias
parameter attribute as well as noalias intrinsic. Note this patch is just
for review. Please give me some suggestion to improve it. Thanks.
Sheng.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20070625/63c3c5d8/attachment.html>
-------------- next part --------------
Index: gcc/llvm-convert.cpp
===================================================================
--- gcc/llvm-convert.cpp (revision 359)
+++ gcc/llvm-convert.cpp (working copy)
@@ -1400,6 +1400,20 @@
BranchFixups.push_back(BranchFixup(BI, isExceptionEdge));
}
+// Emits noalias intrinsic if the decl has the restrict qualifier.
+Value *TreeToLLVM::EmitNoAliasIntrinsic(Value *V) {
+ Function *noAliasFun = Intrinsic::getDeclaration(TheModule,
+ Intrinsic::noalias);
+ PointerType *PT = PointerType::get(IntegerType::Int8Ty);
+ const Type *VTy = V->getType();
+ if (VTy != PT) {
+ V = Builder.CreateBitCast(V, PT, "tmp.be");
+ V = Builder.CreateCall(noAliasFun, V, "tmp.noalias");
+ return Builder.CreateBitCast(V, VTy, "tmp.af.noalias");
+ }
+ return Builder.CreateCall(noAliasFun, V, "tmp.noalias");
+}
+
// Emits annotate intrinsic if the decl has the annotate attribute set.
void TreeToLLVM::EmitAnnotateIntrinsic(Value *V, tree decl) {
@@ -1561,7 +1575,7 @@
// Handle annotate attributes
if (DECL_ATTRIBUTES(decl))
EmitAnnotateIntrinsic(AI, decl);
-
+
if (TheDebugInfo) {
if (DECL_NAME(decl)) {
TheDebugInfo->EmitDeclare(decl, llvm::dwarf::DW_TAG_auto_variable,
@@ -2425,7 +2439,10 @@
// Scalar value: emit a load.
Value *Ptr = CastToType(Instruction::BitCast, LV.Ptr,
PointerType::get(Ty));
- return Builder.CreateLoad(Ptr, isVolatile, "tmp");
+ Value *Tmp = Builder.CreateLoad(Ptr, isVolatile, "tmp");
+ if (isa<PointerType>(Tmp->getType()) && TYPE_RESTRICT(TREE_TYPE(exp)))
+ Tmp = EmitNoAliasIntrinsic(Tmp);
+ return Tmp;
} else {
EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), false, isVolatile);
return 0;
Index: gcc/llvm-internal.h
===================================================================
--- gcc/llvm-internal.h (revision 359)
+++ gcc/llvm-internal.h (working copy)
@@ -453,6 +453,9 @@
/// EmitAnnotateIntrinsic - Emits call to annotate attr intrinsic
void EmitAnnotateIntrinsic(Value *V, tree_node *decl);
+
+ /// EmitNoAliasIntrinsic - Emits call to noalias intrinsic
+ Value *EmitNoAliasIntrinsic(Value *V);
private:
/// GatherTypeInfo - Walk through the expression gathering all the
Index: gcc/llvm-types.cpp
===================================================================
--- gcc/llvm-types.cpp (revision 359)
+++ gcc/llvm-types.cpp (working copy)
@@ -1006,6 +1006,11 @@
else
Attributes |= ParamAttr::SExt;
}
+
+ // Compute noalias attributes.
+ if (TREE_CODE(ArgTy) == POINTER_TYPE)
+ if (TYPE_RESTRICT(ArgTy))
+ Attributes |= ParamAttr::NoAlias;
#ifdef LLVM_TARGET_ENABLE_REGPARM
// Allow the target to mark this as inreg.
More information about the llvm-commits
mailing list