[llvm-bugs] [Bug 45710] New: Alignment for array pointer access
via llvm-bugs
llvm-bugs at lists.llvm.org
Tue Apr 28 02:03:14 PDT 2020
https://bugs.llvm.org/show_bug.cgi?id=45710
Bug ID: 45710
Summary: Alignment for array pointer access
Product: clang
Version: 8.0
Hardware: PC
OS: Windows NT
Status: NEW
Severity: enhancement
Priority: P
Component: C
Assignee: unassignedclangbugs at nondot.org
Reporter: 2077213809 at qq.com
CC: blitzrakete at gmail.com, dgregor at apple.com,
erik.pilkington at gmail.com, llvm-bugs at lists.llvm.org,
richard-llvm at metafoo.co.uk
When accessing an array pointer, the compiler considers it to be aligned 1,
even if the element it points to is aligned 4.
The code is as follows:
int alignaddress[10];
void test() {
int (*p)[] = &alignaddress;
(*p)[2] = 0x12;
}
clang -O0 --target=arm-none-eabi -emit-llvm -S test.c
IR: the store 0x12 is align 1
define dso_local void @test() #0 {
%1 = alloca [0 x i32]*, align 4
store [0 x i32]* bitcast ([10 x i32]* @alignaddress to [0 x i32]*), [0 x
i32]** %1, align 4
%2 = load [0 x i32]*, [0 x i32]** %1, align 4
%3 = getelementptr inbounds [0 x i32], [0 x i32]* %2, i32 0, i32 2
store i32 18, i32* %3, align 1
ret void
}
when we dont allow unaligned-access, it will use 4 strb instruction to access
CMD: llc -mattr=+strict-align test.ll
test:
.fnstart
@ %bb.0:
.pad #4
sub sp, sp, #4
ldr r0, .LCPI0_0
str r0, [sp]
ldr r0, [sp]
mov r1, #18
strb r1, [r0, #8]!
mov r1, #0
strb r1, [r0, #3]
strb r1, [r0, #2]
strb r1, [r0, #1]
add sp, sp, #4
bx lr
gcc think it is an aligned access.
CMD: arm-none-eabi-gcc -mno-unaligned-access -S test.c
test:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #12
ldr r3, .L2
str r3, [fp, #-8]
ldr r3, [fp, #-8]
mov r2, #18
str r2, [r3, #8]
nop
add sp, fp, #0
@ sp needed
ldr fp, [sp], #4
bx lr
Is this a bug or is the llvm processing more conservative because the address
which the pointer points is unknown?
But in the following case, llvm thinks it's aligned 4.
int a;
void test() {
int *p = &a;
*p = 2;
}
However, in the current scenario, I think that the llvm processing is
incorrect.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200428/5eed719a/attachment.html>
More information about the llvm-bugs
mailing list