mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 15:46:08 +00:00

Previously, EnterStructPointerForCoercedAccess used Alloc size when determining how to convert. This was problematic, because there were situations were the alloc size was larger than the store size. For example, if the first element of a structure were i24 and the destination type were i32, the old code would generate a GEP and a load i24. The code should compare store sizes to ensure the whole object is loaded. I have attached a test case. This patch modifies the output of arm64-be-bitfield.c test case, but the new IR seems to be equivalent, and after -O3, the compiler generates identical ARM assembly. (asr x0, x0, #54) Patch by Thomas Jablin! llvm-svn: 216722
16 lines
682 B
C
16 lines
682 B
C
// REQUIRES: aarch64-registered-target
|
|
// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o - %s | FileCheck --check-prefix IR %s
|
|
// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -ffreestanding -S -O1 -o - %s | FileCheck --check-prefix ARM %s
|
|
|
|
struct bt3 { signed b2:10; signed b3:10; } b16;
|
|
|
|
// Get the high 32-bits and then shift appropriately for big-endian.
|
|
signed callee_b0f(struct bt3 bp11) {
|
|
// IR: callee_b0f(i64 [[ARG:%.*]])
|
|
// IR: store i64 [[ARG]], i64* [[PTR:%.*]]
|
|
// IR: [[BITCAST:%.*]] = bitcast i64* [[PTR]] to i8*
|
|
// IR: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* [[BITCAST]], i64 4
|
|
// ARM: asr x0, x0, #54
|
|
return bp11.b2;
|
|
}
|