[llvm-commits] [llvm-gcc-4.2] r112273 - in /llvm-gcc-4.2/trunk/gcc: config/arm/llvm-arm.cpp llvm-convert.cpp llvm-internal.h
Bob Wilson
bob.wilson at apple.com
Fri Aug 27 10:15:02 PDT 2010
Author: bwilson
Date: Fri Aug 27 12:15:02 2010
New Revision: 112273
URL: http://llvm.org/viewvc/llvm-project?rev=112273&view=rev
Log:
Add the new alignment operands for calls to NEON load/store intrinsics.
Modified:
llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
Modified: llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp?rev=112273&r1=112272&r2=112273&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp Fri Aug 27 12:15:02 2010
@@ -2010,7 +2010,9 @@
intID = Intrinsic::arm_neon_vld1;
intFn = Intrinsic::getDeclaration(TheModule, intID, &ResultType, 1);
Type *VPTy = PointerType::getUnqual(Type::getInt8Ty(Context));
- Result = Builder.CreateCall(intFn, BitCastToType(Ops[0], VPTy));
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Result = Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy),
+ getInt32Const(Align));
break;
}
@@ -2028,7 +2030,9 @@
}
intFn = Intrinsic::getDeclaration(TheModule, intID, &VTy, 1);
Type *VPTy = PointerType::getUnqual(Type::getInt8Ty(Context));
- Result = Builder.CreateCall(intFn, BitCastToType(Ops[0], VPTy));
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Result = Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy),
+ getInt32Const(Align));
Builder.CreateStore(Result, DestLoc->Ptr);
Result = 0;
break;
@@ -2074,6 +2078,8 @@
Args.push_back(Builder.CreateExtractValue(Ops[1], n));
}
Args.push_back(Ops[2]); // lane number
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Args.push_back(getInt32Const(Align));
Result = Builder.CreateCall(intFn, Args.begin(), Args.end());
Builder.CreateStore(Result, DestLoc->Ptr);
Result = 0;
@@ -2103,7 +2109,9 @@
}
intFn = Intrinsic::getDeclaration(TheModule, intID, intOpTypes, 1);
Type *VPTy = PointerType::getUnqual(Type::getInt8Ty(Context));
- Result = Builder.CreateCall(intFn, BitCastToType(Ops[0], VPTy));
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Result = Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy),
+ getInt32Const(Align));
Builder.CreateStore(Result, DestLoc->Ptr);
Result = 0;
break;
@@ -2131,6 +2139,8 @@
Args.push_back(UndefValue::get(VTy));
}
Args.push_back(getInt32Const(0));
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Args.push_back(getInt32Const(Align));
Result = Builder.CreateCall(intFn, Args.begin(), Args.end());
// Now splat the values in lane 0 to the rest of the elements.
@@ -2150,7 +2160,9 @@
intID = Intrinsic::arm_neon_vst1;
intFn = Intrinsic::getDeclaration(TheModule, intID, &VTy, 1);
Type *VPTy = PointerType::getUnqual(Type::getInt8Ty(Context));
- Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy), Ops[1]);
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Builder.CreateCall3(intFn, BitCastToType(Ops[0], VPTy), Ops[1],
+ getInt32Const(Align));
Result = 0;
break;
}
@@ -2181,6 +2193,8 @@
for (unsigned n = 0; n != NumVecs; ++n) {
Args.push_back(Builder.CreateExtractValue(Ops[1], n));
}
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Args.push_back(getInt32Const(Align));
Builder.CreateCall(intFn, Args.begin(), Args.end());
Result = 0;
break;
@@ -2226,6 +2240,8 @@
Args.push_back(Builder.CreateExtractValue(Ops[1], n));
}
Args.push_back(Ops[2]); // lane number
+ unsigned Align = getPointerAlignment(TREE_VALUE(TREE_OPERAND(exp, 1)));
+ Args.push_back(getInt32Const(Align));
Builder.CreateCall(intFn, Args.begin(), Args.end());
Result = 0;
break;
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=112273&r1=112272&r2=112273&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Aug 27 12:15:02 2010
@@ -140,7 +140,7 @@
/// getPointerAlignment - Return the alignment in bytes of exp, a pointer valued
/// expression, or 1 if the alignment is not known.
-static unsigned int getPointerAlignment(tree exp) {
+unsigned int getPointerAlignment(tree exp) {
assert(POINTER_TYPE_P (TREE_TYPE (exp)) && "Expected a pointer type!");
unsigned int align = get_pointer_alignment(exp, BIGGEST_ALIGNMENT) / 8;
return align ? align : 1;
Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=112273&r1=112272&r2=112273&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Fri Aug 27 12:15:02 2010
@@ -190,6 +190,10 @@
/// overflowed constants. These conditions can be checked by calling isInt64.
uint64_t getInt64(tree_node *t, bool Unsigned);
+/// getPointerAlignment - Return the alignment in bytes of exp, a pointer valued
+/// expression, or 1 if the alignment is not known.
+unsigned int getPointerAlignment(tree_node *exp);
+
/// isPassedByInvisibleReference - Return true if the specified type should be
/// passed by 'invisible reference'. In other words, instead of passing the
/// thing by value, pass the address of a temporary.
More information about the llvm-commits
mailing list