[llvm-commits] [PATCH] Fix SciMark2-C test case hanging

Duncan Sands baldrick at free.fr
Thu Oct 11 06:49:53 PDT 2012


Hi Simon,

> On Thu, Oct 11, 2012 at 9:50 AM, Duncan Sands <baldrick at free.fr> wrote:
>>> Test case MultiSource\Benchmarks\SciMark2-C hangs [1] due excessive
>>> optimization of SparseCompRow_matmult() routine. This function
>>> computes a matrix-vector multiply with a sparse matrix. The result
>>> vector is not used and optimizer throws away the function's body.
>>
>> how could this cause a hang?
>
> Reduced test case is attached to this e-mail. Here is a command
> reproduces the problem:
> $ clang -O3 check.c
>
> In short, original and reduced test cases contains the following code.
> It repeats some calculations more and more and stops when execution
> time exceeds a limit.

thanks for explaining.  Tests in the testsuite need to be deterministic,
eg so their output can be checked for correctness against some reference
output.  It sounds like this test is not deterministic - is that right?

Ciao, Duncan.

  The calculation result is stored in the array
> but is not used anywhere. That is why the optimizer throws away the
> array allocation/deallocation and the calculation and the loop runs
> infinitely.
> [[
>    int *arr = malloc(arrSize * sizeof(*arr));
>
>    int iterCount = 1;
>    clock_t start, delta;
>
>    while (1)
>    {
>      start = clock();
>      worker(iterCount, arr, arrSize);  // do calculation "iterCount"
> times and save result to "arr"
>      delta = clock() - start;
>
>      if (delta > CLOCKS_PER_SEC)
>        break;
>
>      iterCount *= 2;
>    }
>
>    free(arr);
> ]]
>
> Here is a piece of LLVM assembly language corresponds to the "while loop":
> [[
> while.body.us.i:                                  ; preds =
> %while.body.us.i, %entry
>    %call1.us.i = tail call i32 @clock() nounwind
>    %call2.us.i = tail call i32 @clock() nounwind
>    %sub.us.i = sub nsw i32 %call2.us.i, %call1.us.i
>    %cmp.us.i = icmp sgt i32 %sub.us.i, 1000000
>    br i1 %cmp.us.i, label %run.exit, label %while.body.us.i
>
> run.exit:                                         ; preds = %while.body.us.i
>    ret i32 0
> ]]
>
>>> The attached patch does a trick to prevent optimization and fixes this
>>> problem.
>>
>> Are you saying that the optimization is wrong?  If so it is the optimizers
>> that should be fixed...
>
> There was a discussion about similar optimization in this thread:
> http://goo.gl/QIHBC. As far as I understand the optimization is
> correct in general. But in the SciMark2-C test case we measure a
> calculation speed and compare results with gcc. The optimization does
> not allow to do that and we have to escape it.
>
> My patch does that in a tricky way. Maybe more clear and excplicit
> approach is to use the calculation result somehow. For example, sum
> all array's elements and print. That do you think?
>
> --
> Regards,
> Simon
>




More information about the llvm-commits mailing list