[LLVMbugs] [Bug 10873] New: clang messes up dependence, improperly moves load past use
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Tue Sep 6 14:33:17 PDT 2011
http://llvm.org/bugs/show_bug.cgi?id=10873
Summary: clang messes up dependence, improperly moves load past
use
Product: clang
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P
Component: LLVM Codegen
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: whaley at cs.utsa.edu
CC: llvmbugs at cs.uiuc.edu
I believe I've found a bug in clang/llvm on a sandy bridge CPU. I am using
the svn version of clang downloaded Sep 03, 2011:
>sb4>clang -v
>clang version 3.0 (trunk 139049)
>Target: x86_64-unknown-linux-gnu
>Thread model: posix
Take this piece of code:
*******************************************************************************
void ATL_UGEMV(const int M, const int N, const double *A, const int lda,
const double *X, double *Y)
/*
* y = [0,1]*y + A*x, A is MxN, storing the transpose of the matrix
*/
{
double ry, iy;
const int lda2 = lda+lda;
int j;
void dotu_sub(const int, const double*, const int, const double*,
const int, double *);
for (j=0; j < N; j++, A += lda2, Y += 2)
{
ry = *Y; iy = Y[1];
dotu_sub(M, A, 1, X, 1, Y);
*Y += ry;
Y[1] += iy;
}
}
*******************************************************************************
If you compile with
clang -fomit-frame-pointer -mavx -O2 -m64 -S
I believe you will find that clang waits until *after* the subroutine call
to load the values, at which point they have been overwritten by the call.
In order to get clang to produce the right answer, you must rewrite
the loop in this way:
for (j=0; j < N; j++, A += lda2, Y += 2)
{
double dot[2]
dotu_sub(M, A, 1, X, 1, dot);
*Y += dot[0];
Y[1] += dot[1];
}
Thanks,
Clint
--
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