[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