<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Semantic error - - different output are observed on changing flags"
   href="https://bugs.llvm.org/show_bug.cgi?id=51411">51411</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Semantic error - - different output are observed on changing flags
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>12.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>release blocker
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>new bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>Rohit.Aggarwal@amd.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>The issue is present in main stream LLVM. I tired the example code on clang-12
release.

## Sample Code (inline_ex.c)

int main() {
  double dbl;

  unsigned i[1000], j[1000], k[1000], l[1000];
  int index;

  for (index = 0; index < 1000; index++) {
    i[index] = j[index] = k[index] = l[index] = 10000;
  }
  unsigned long r1=0, r2=0, r3=0, r4=0;
  for (int a = 0; a < 1000; a++) {
    r1 += i[a];
    r2 += j[a];
    r3 += k[a];
    r4 += l[a];
  }

  double R1 = DBL_MAX + (double)r1;
  double R2 = DBL_MAX + (double)r2;
  double R3 = DBL_MAX + (double)r3;
  double R4 = DBL_MAX + (double)r4;
  // printf("%lf\n%lf\n%lf\n%lf\n", R1, R2, R3, R4);
  dbl = R1 + R2 + R3 + R4;

  printf("Result: %lf\n", dbl);

  return 0;
}


## GCC

(gcc   inline_ex.c   -o a.out && ./a.out )
Result: inf

(gcc   inline_ex.c  -O3 -ffast-math -o a.out && ./a.out )
Result: inf

## CLANG 12
clang-12 -O3  -flto -ffast-math -fno-unroll-loops  inline_ex.c   -o a.out &&
./a.out )                 
Result: 0.000000

(clang-12 -O3  -ffast-math   inline_ex.c   -o a.out && ./a.out )
Result: 0.000000

(clang-12 -O3  -flto  -fno-unroll-loops  inline_ex.c   -o a.out && ./a.out )
Result: inf

(clang-12 -O3   inline_ex.c   -o a.out && ./a.out )
Result: inf

(clang-12   inline_ex.c   -o a.out && ./a.out )
Result: inf



Observation

The problem occurs when we use fast-math flag with O3. This flag enables
certain transformation in instCombine pass which leads to creation of poison
value. The poison value is not handle properly and is propagated to it's uses.
In the end, a poison value remains as the operand in printf. The value of
poison depends upon type and for double the value is 0.0000.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>