[LLVMbugs] [Bug 4430] New: Too weak memory operation alignment from llvm-gcc with -O0
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Mon Jun 22 09:10:36 PDT 2009
http://llvm.org/bugs/show_bug.cgi?id=4430
Summary: Too weak memory operation alignment from llvm-gcc with -
O0
Product: new-bugs
Version: unspecified
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: new bugs
AssignedTo: unassignedbugs at nondot.org
ReportedBy: hkultala at cs.tut.fi
CC: llvmbugs at cs.uiuc.edu
C-code
__attribute__((noinline))
void resInput(int *restrict input_buf, int *restrict output_buf) {
for (int i = 0; i < 4; ++i) {
output_buf[i] = input_buf[i];
}
}
gets compiled into
define void @resInput(i32* noalias %input_buf, i32* noalias %output_buf)
nounwind noinline {
entry:
%input_buf_addr = alloca i32* ; <i32**> [#uses=2]
%output_buf_addr = alloca i32* ; <i32**> [#uses=2]
%i = alloca i32 ; <i32*> [#uses=6]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
store i32* %input_buf, i32** %input_buf_addr
store i32* %output_buf, i32** %output_buf_addr
store i32 0, i32* %i, align 4
br label %bb1
bb: ; preds = %bb1
%0 = load i32** %input_buf_addr, align 4 ; <i32*>
[#uses=1]
%1 = load i32* %i, align 4 ; <i32> [#uses=1]
%2 = getelementptr i32* %0, i32 %1 ; <i32*> [#uses=1]
%3 = load i32* %2, align 1 ; <i32> [#uses=1]
%4 = load i32** %output_buf_addr, align 4 ; <i32*>
[#uses=1]
%5 = load i32* %i, align 4 ; <i32> [#uses=1]
%6 = getelementptr i32* %4, i32 %5 ; <i32*> [#uses=1]
store i32 %3, i32* %6, align 1
%7 = load i32* %i, align 4 ; <i32> [#uses=1]
%8 = add i32 %7, 1 ; <i32> [#uses=1]
store i32 %8, i32* %i, align 4
br label %bb1
bb1: ; preds = %bb, %entry
%9 = load i32* %i, align 4 ; <i32> [#uses=1]
%10 = icmp sle i32 %9, 3 ; <i1> [#uses=1]
br i1 %10, label %bb, label %bb2
bb2: ; preds = %bb1
br label %return
return: ; preds = %bb2
ret void
}
when compiled with -O0. Some of those load i32 and store i32 operations have
align 1 instead of align 4.
With -O1 alignment is correct, the code becomes:
define void @resInput(i32* noalias %input_buf, i32* noalias %output_buf)
nounwind noinline {
bb1.thread:
br label %bb1
bb1: ; preds = %bb1, %bb1.thread
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ]
; <i32> [#uses=3]
%0 = getelementptr i32* %input_buf, i32 %i.0.reg2mem.0 ;
<i32*> [#uses=1]
%1 = load i32* %0, align 4 ; <i32> [#uses=1]
%2 = getelementptr i32* %output_buf, i32 %i.0.reg2mem.0 ;
<i32*> [#uses=1]
store i32 %1, i32* %2, align 4
%indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32>
[#uses=2]
%exitcond = icmp eq i32 %indvar.next, 4 ; <i1> [#uses=1]
br i1 %exitcond, label %return, label %bb1
return: ; preds = %bb1
ret void
}
Here the load and store have align 4 as it should have.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list