[llvm-commits] [dragonegg] r146554 - /dragonegg/trunk/src/Constants.cpp
Duncan Sands
baldrick at free.fr
Wed Dec 14 00:23:44 PST 2011
Author: baldrick
Date: Wed Dec 14 02:23:44 2011
New Revision: 146554
URL: http://llvm.org/viewvc/llvm-project?rev=146554&view=rev
Log:
When turning part of a constant into bits, in some cases all of the
constant was being converted, not just the needed bits, resulting in
a lot of pointless work being done. This would happen if the constant
was an element of a containing aggregate constant, for example an array.
Modified:
dragonegg/trunk/src/Constants.cpp
Modified: dragonegg/trunk/src/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Constants.cpp?rev=146554&r1=146553&r2=146554&view=diff
==============================================================================
--- dragonegg/trunk/src/Constants.cpp (original)
+++ dragonegg/trunk/src/Constants.cpp Wed Dec 14 02:23:44 2011
@@ -334,12 +334,15 @@
BitSlice Bits;
SignedRange StrideRange(0, Stride);
for (unsigned i = FirstElt; i < LastElt; ++i) {
+ int EltOffsetInBits = i * Stride;
// Extract the element.
Constant *Elt = Folder.CreateExtractValue(C, i);
// View it as a bunch of bits.
- BitSlice EltBits = ViewAsBits(Elt, StrideRange, Folder);
+ SignedRange NeededBits = StrideRange.Meet(R.Displace(-EltOffsetInBits));
+ assert(!NeededBits.empty() && "Used element computation wrong!");
+ BitSlice EltBits = ViewAsBits(Elt, NeededBits, Folder);
// Add to the already known bits.
- Bits.Merge(EltBits.Displace(i * Stride), Folder);
+ Bits.Merge(EltBits.Displace(EltOffsetInBits), Folder);
}
return Bits;
}
@@ -348,21 +351,26 @@
StructType *STy = cast<StructType>(Ty);
const StructLayout *SL = getTargetData().getStructLayout(STy);
// Fields with indices in [FirstIdx, LastIdx) overlap the range.
- unsigned FirstIdx = SL->getElementContainingOffset((R.getFirst()+7)/8);
- unsigned LastIdx = 1 + SL->getElementContainingOffset((R.getLast()+6)/8);
+ unsigned FirstIdx = SL->getElementContainingOffset(R.getFirst()/8);
+ unsigned LastIdx = 1 + SL->getElementContainingOffset((R.getLast()-1)/8);
// Visit all fields that overlap the requested range, accumulating their
// bits in Bits.
BitSlice Bits;
for (unsigned i = FirstIdx; i < LastIdx; ++i) {
+ int FieldOffsetInBits = SL->getElementOffset(i) * 8;
// Extract the field.
Constant *Field = Folder.CreateExtractValue(C, i);
- // View it as a bunch of bits.
+ // Only part of the field may be needed. Compute which bits they are.
Type *FieldTy = Field->getType();
unsigned FieldStoreSize = getTargetData().getTypeStoreSizeInBits(FieldTy);
- BitSlice FieldBits = ViewAsBits(Field, SignedRange(0, FieldStoreSize),
- Folder);
- // Add to the already known bits.
- Bits.Merge(FieldBits.Displace(SL->getElementOffset(i)*8), Folder);
+ SignedRange NeededBits(0, FieldStoreSize);
+ NeededBits = NeededBits.Meet(R.Displace(-FieldOffsetInBits));
+ // View the needed part of the field as a bunch of bits.
+ if (!NeededBits.empty()) { // No field bits needed if only using padding.
+ BitSlice FieldBits = ViewAsBits(Field, NeededBits, Folder);
+ // Add to the already known bits.
+ Bits.Merge(FieldBits.Displace(FieldOffsetInBits), Folder);
+ }
}
return Bits;
}
@@ -381,13 +389,16 @@
BitSlice Bits;
SignedRange StrideRange(0, Stride);
for (unsigned i = FirstElt; i < LastElt; ++i) {
+ int EltOffsetInBits = i * Stride;
// Extract the element.
ConstantInt *Idx = ConstantInt::get(Type::getInt32Ty(Context), i);
Constant *Elt = Folder.CreateExtractElement(C, Idx);
// View it as a bunch of bits.
- BitSlice EltBits = ViewAsBits(Elt, StrideRange, Folder);
+ SignedRange NeededBits = StrideRange.Meet(R.Displace(-EltOffsetInBits));
+ assert(!NeededBits.empty() && "Used element computation wrong!");
+ BitSlice EltBits = ViewAsBits(Elt, NeededBits, Folder);
// Add to the already known bits.
- Bits.Merge(EltBits.Displace(i * Stride), Folder);
+ Bits.Merge(EltBits.Displace(EltOffsetInBits), Folder);
}
return Bits;
}
More information about the llvm-commits
mailing list