[CodeGen] Use llvm::bit_ceil (NFC)
authorKazu Hirata <kazu@google.com>
Wed, 25 Jan 2023 06:54:53 +0000 (22:54 -0800)
committerKazu Hirata <kazu@google.com>
Wed, 25 Jan 2023 06:54:53 +0000 (22:54 -0800)
If we know that x is nonzero and not a power of 2, then
llvm::findLastSet(x) + 1 is the index of the bit just above the
highest set bit in x.  That is, 1 << (llvm::findLastSet(x) + 1) is the
same as llvm::bit_ceil(x).

Since llvm::bit_ceil is a nop on a power of 2, we can unconditionally
call llvm::bit_ceil.  The end result actually matches the comment.

clang/lib/CodeGen/SwiftCallingConv.cpp

index 6b868fe..63d9751 100644 (file)
@@ -659,9 +659,7 @@ CharUnits swiftcall::getNaturalAlignment(CodeGenModule &CGM, llvm::Type *type) {
   // For Swift's purposes, this is always just the store size of the type
   // rounded up to a power of 2.
   auto size = (unsigned long long) getTypeStoreSize(CGM, type).getQuantity();
-  if (!isPowerOf2(size)) {
-    size = 1ULL << (llvm::findLastSet(size, llvm::ZB_Undefined) + 1);
-  }
+  size = llvm::bit_ceil(size);
   assert(CGM.getDataLayout().getABITypeAlign(type) <= size);
   return CharUnits::fromQuantity(size);
 }