[llvm-commits] [llvm-gcc-4.2] r40744 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h tree.c
Lauro Ramos Venancio
lauro.venancio at gmail.com
Thu Aug 2 10:51:38 PDT 2007
Author: laurov
Date: Thu Aug 2 12:51:38 2007
New Revision: 40744
URL: http://llvm.org/viewvc/llvm-project?rev=40744&view=rev
Log:
Set the alignment of loads and stores. (PR1548)
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
llvm-gcc-4.2/trunk/gcc/tree.c
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=40744&r1=40743&r2=40744&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Aug 2 12:51:38 2007
@@ -1183,13 +1183,19 @@
/// ptrs, copying all of the elements.
static void CopyAggregate(Value *DestPtr, Value *SrcPtr,
bool isDstVolatile, bool isSrcVolatile,
- LLVMBuilder &Builder) {
+ unsigned Alignment, LLVMBuilder &Builder) {
assert(DestPtr->getType() == SrcPtr->getType() &&
"Cannot copy between two pointers of different type!");
const Type *ElTy = cast<PointerType>(DestPtr->getType())->getElementType();
+
+ unsigned TypeAlign = getTargetData().getABITypeAlignment(ElTy);
+ Alignment = MIN(Alignment, TypeAlign);
+
if (ElTy->isFirstClassType()) {
LoadInst *V = Builder.CreateLoad(SrcPtr, isSrcVolatile, "tmp");
- Builder.CreateStore(V, DestPtr, isDstVolatile);
+ StoreInst *S = Builder.CreateStore(V, DestPtr, isDstVolatile);
+ V->setAlignment(Alignment);
+ S->setAlignment(Alignment);
} else if (const StructType *STy = dyn_cast<StructType>(ElTy)) {
Constant *Zero = ConstantInt::get(Type::Int32Ty, 0);
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
@@ -1198,7 +1204,8 @@
Constant *Idx = ConstantInt::get(Type::Int32Ty, i);
Value *DElPtr = Builder.CreateGEP(DestPtr, Zero, Idx, "tmp");
Value *SElPtr = Builder.CreateGEP(SrcPtr, Zero, Idx, "tmp");
- CopyAggregate(DElPtr, SElPtr, isDstVolatile, isSrcVolatile, Builder);
+ CopyAggregate(DElPtr, SElPtr, isDstVolatile, isSrcVolatile, Alignment,
+ Builder);
}
} else {
const ArrayType *ATy = cast<ArrayType>(ElTy);
@@ -1207,7 +1214,8 @@
Constant *Idx = ConstantInt::get(Type::Int32Ty, i);
Value *DElPtr = Builder.CreateGEP(DestPtr, Zero, Idx, "tmp");
Value *SElPtr = Builder.CreateGEP(SrcPtr, Zero, Idx, "tmp");
- CopyAggregate(DElPtr, SElPtr, isDstVolatile, isSrcVolatile, Builder);
+ CopyAggregate(DElPtr, SElPtr, isDstVolatile, isSrcVolatile, Alignment,
+ Builder);
}
}
}
@@ -1235,7 +1243,8 @@
/// EmitAggregateCopy - Copy the elements from SrcPtr to DestPtr, using the
/// GCC type specified by GCCType to know which elements to copy.
void TreeToLLVM::EmitAggregateCopy(Value *DestPtr, Value *SrcPtr, tree type,
- bool isDstVolatile, bool isSrcVolatile) {
+ bool isDstVolatile, bool isSrcVolatile,
+ unsigned Alignment) {
if (DestPtr == SrcPtr && !isDstVolatile && !isSrcVolatile)
return; // noop copy.
@@ -1254,12 +1263,12 @@
PointerType::get(LLVMTy));
SrcPtr = CastToType(Instruction::BitCast, SrcPtr,
PointerType::get(LLVMTy));
- CopyAggregate(DestPtr, SrcPtr, isDstVolatile, isSrcVolatile, Builder);
+ CopyAggregate(DestPtr, SrcPtr, isDstVolatile, isSrcVolatile, Alignment,
+ Builder);
return;
}
}
- unsigned Alignment = TYPE_ALIGN_OK(type) ? (TYPE_ALIGN_UNIT(type) & ~0U) : 0;
Value *TypeSize = Emit(TYPE_SIZE_UNIT(type), 0);
EmitMemCpy(DestPtr, SrcPtr, TypeSize, Alignment);
}
@@ -2511,14 +2520,17 @@
const Type *Ty = ConvertType(TREE_TYPE(exp));
if (!LV.isBitfield()) {
-
+ unsigned Alignment = expr_align(exp) / 8;
if (!DestLoc) {
// Scalar value: emit a load.
Value *Ptr = CastToType(Instruction::BitCast, LV.Ptr,
PointerType::get(Ty));
- return Builder.CreateLoad(Ptr, isVolatile, "tmp");
+ LoadInst *LI = Builder.CreateLoad(Ptr, isVolatile, "tmp");
+ LI->setAlignment(Alignment);
+ return LI;
} else {
- EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), false, isVolatile);
+ EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), false, isVolatile,
+ Alignment);
return 0;
}
} else {
@@ -2949,6 +2961,7 @@
LValue LV = EmitLV(TREE_OPERAND(exp, 0));
bool isVolatile = TREE_THIS_VOLATILE(TREE_OPERAND(exp, 0));
+ unsigned Alignment = expr_align(TREE_OPERAND(exp, 0)) / 8;
if (!LV.isBitfield()) {
const Type *ValTy = ConvertType(TREE_TYPE(TREE_OPERAND(exp, 1)));
@@ -2961,14 +2974,16 @@
RHS = CastToAnyType(RHS, Op1Signed, PT->getElementType(), Op0Signed);
else
LV.Ptr = BitCastToType(LV.Ptr, PointerType::get(RHS->getType()));
- Builder.CreateStore(RHS, LV.Ptr, isVolatile);
+ StoreInst *SI = Builder.CreateStore(RHS, LV.Ptr, isVolatile);
+ SI->setAlignment(Alignment);
return RHS;
}
// Non-bitfield aggregate value.
if (DestLoc) {
Emit(TREE_OPERAND(exp, 1), LV.Ptr);
- EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), isVolatile, false);
+ EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), isVolatile, false,
+ Alignment);
} else if (!isVolatile) {
Emit(TREE_OPERAND(exp, 1), LV.Ptr);
} else {
@@ -2981,7 +2996,7 @@
Value *Tmp = CreateTemporary(ConvertType(TREE_TYPE(TREE_OPERAND(exp,1))));
Emit(TREE_OPERAND(exp, 1), Tmp);
EmitAggregateCopy(LV.Ptr, Tmp, TREE_TYPE(TREE_OPERAND(exp,1)),
- isVolatile, false);
+ isVolatile, false, Alignment);
}
return 0;
}
@@ -3095,8 +3110,10 @@
LValue LV = EmitLV(Op);
assert(!LV.isBitfield() && "Expected an aggregate operand!");
bool isVolatile = TREE_THIS_VOLATILE(Op);
+ unsigned Alignment = expr_align(Op) / 8;
- EmitAggregateCopy(Target, LV.Ptr, TREE_TYPE(exp), false, isVolatile);
+ EmitAggregateCopy(Target, LV.Ptr, TREE_TYPE(exp), false, isVolatile,
+ Alignment);
break;
}
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=40744&r1=40743&r2=40744&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Thu Aug 2 12:51:38 2007
@@ -460,7 +460,8 @@
/// EmitAggregateCopy - Copy the elements from SrcPtr to DestPtr, using the
/// GCC type specified by GCCType to know which elements to copy.
void EmitAggregateCopy(Value *DestPtr, Value *SrcPtr, tree_node *GCCType,
- bool isDstVolatile, bool isSrcVolatile);
+ bool isDstVolatile, bool isSrcVolatile,
+ unsigned Alignment);
/// EmitAggregateZero - Zero the elements of DestPtr.
///
void EmitAggregateZero(Value *DestPtr, tree_node *GCCType);
Modified: llvm-gcc-4.2/trunk/gcc/tree.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/tree.c?rev=40744&r1=40743&r2=40744&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/tree.c (original)
+++ llvm-gcc-4.2/trunk/gcc/tree.c Thu Aug 2 12:51:38 2007
@@ -1896,6 +1896,10 @@
case SAVE_EXPR: case COMPOUND_EXPR: case MODIFY_EXPR:
case INIT_EXPR: case TARGET_EXPR: case WITH_CLEANUP_EXPR:
case CLEANUP_POINT_EXPR:
+ /* LLVM local begin */
+ /* return correctly the alignment of packed structs */
+ case COMPONENT_REF:
+ /* LLVM local end */
/* These don't change the alignment of an object. */
return expr_align (TREE_OPERAND (t, 0));
More information about the llvm-commits
mailing list