Author: jamesm
Date: Wed May  7 12:41:15 2014
New Revision: 208231

URL: http://llvm.org/viewvc/llvm-project?rev=208231&view=rev
Log:
When doing int<->ptr coercion for big-endian, calculate the shift amount 
correctly.

Previously we calculated the shift amount based upon 
DataLayout::getTypeAllocSizeInBits.
This will only work for legal types - types such as i24 that are created as 
part of
structs for bitfields will return "32" from that function. Change to using
getTypeSizeInBits.

It turns out that AArch64 didn't run across this problem because it always 
returned
[1 x i64] as the type for a bitfield, whereas ARM64 returns i64 so goes down 
this
(better, but wrong) codepath.

Added:
    cfe/trunk/test/CodeGen/arm64-be-bitfield.c
Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=208231&r1=208230&r2=208231&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed May  7 12:41:15 2014
@@ -700,8 +700,9 @@ static llvm::Value *CoerceIntOrPtrToIntO
     if (DL.isBigEndian()) {
       // Preserve the high bits on big-endian targets.
       // That is what memory coercion does.
-      uint64_t SrcSize = DL.getTypeAllocSizeInBits(Val->getType());
-      uint64_t DstSize = DL.getTypeAllocSizeInBits(DestIntTy);
+      uint64_t SrcSize = DL.getTypeSizeInBits(Val->getType());
+      uint64_t DstSize = DL.getTypeSizeInBits(DestIntTy);
+
       if (SrcSize > DstSize) {
         Val = CGF.Builder.CreateLShr(Val, SrcSize - DstSize, 
"coerce.highbits");
         Val = CGF.Builder.CreateTrunc(Val, DestIntTy, "coerce.val.ii");

Added: cfe/trunk/test/CodeGen/arm64-be-bitfield.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm64-be-bitfield.c?rev=208231&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/arm64-be-bitfield.c (added)
+++ cfe/trunk/test/CodeGen/arm64-be-bitfield.c Wed May  7 12:41:15 2014
@@ -0,0 +1,9 @@
+// RUN:  %clang_cc1 -triple arm64_be-linux-gnu -ffreestanding -emit-llvm -O0 
-o - %s | FileCheck %s
+
+struct bt3 { signed b2:10; signed b3:10; } b16;
+
+// The correct right-shift amount is 40 bits for big endian.
+signed callee_b0f(struct bt3 bp11) {
+// CHECK: = lshr i64 %{{.*}}, 40
+  return bp11.b2;
+}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to