Speed up getABITypeSize by turning a i64 mul and div into an
authorChris Lattner <sabre@nondot.org>
Mon, 8 Dec 2008 06:50:51 +0000 (06:50 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 8 Dec 2008 06:50:51 +0000 (06:50 +0000)
AND.  This is speedup on any reasonable target, but particularly
on 32-bit targets where this often turns into a libcall like udivdi3.

We know that alignments are a power of two but the compiler doesn't.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60688 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetData.h

index 7c274cec2d3fffebda2bc7c1cae41ec7f272a891..fdb21c5ea1e0f4c3d228466eb4b5e42dbc22872d 100644 (file)
@@ -178,8 +178,12 @@ public:
   /// that alloca reserves for this type.  For example, returns 12 or 16 for
   /// x86_fp80, depending on alignment.
   uint64_t getABITypeSize(const Type* Ty) const {
-    unsigned char Align = getABITypeAlignment(Ty);
-    return (getTypeStoreSize(Ty) + Align - 1)/Align*Align;
+    // The alignment of a type is always a power of two.
+    unsigned char AlignMinusOne = getABITypeAlignment(Ty)-1;
+
+    // Round up to the next alignment boundary.
+    uint64_t RoundUp = getTypeStoreSize(Ty) + AlignMinusOne;
+    return RoundUp &= ~uint64_t(AlignMinusOne);
   }
 
   /// getABITypeSizeInBits - Return the offset in bits between successive