<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 - [LSR, PostRA scheduler] -stress-ivchain gives wrong-code."
   href="https://bugs.llvm.org/show_bug.cgi?id=48200">48200</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[LSR, PostRA scheduler] -stress-ivchain gives wrong-code.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </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>enhancement
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>Scalar Optimizations
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>paulsson@linux.vnet.ibm.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=24170" name="attach_24170" title="reduced testcase">attachment 24170</a> <a href="attachment.cgi?id=24170&action=edit" title="reduced testcase">[details]</a></span>
reduced testcase

This program:

int a[] = {0, 6, 0, 0, 6, 0, 0};
int b = 0, d, e;
int c[28];
int main() {
  for (; b <= 6; b++) {
    d = 0;
    for (; d <= 3; d++) {
      for (;;) {
        c[d * 3] = 10;
        break;
      }
      c[b] = a[b];
    }
  }
  for (e = 0; e < 7; e++)
    printf("%d\n", c[e]);
}

is incorrectly compiled with

clang -O3 -target s390x-linux-gnu -march=arch13 -o a.out -w -mllvm
-disable-licm-promotion -mllvm -stress-ivchain

On thing that is a bit odd is the computation of the address to @c:

%uglygep = getelementptr i8, i8* %lsr.iv245, i64 sub (i64 ptrtoint ([28 x i32]*
@c to i64), i64 ptrtoint ([7 x i32]* @a to i64))

%lsr.iv245 is the address of @a, and then @c - @a is used to get an address
into @c. I suppose this means that if @c is declared after @a in the source
file, the difference of their addresses can be used in this way, or?

It seems then that the problem is with the post-RA machine scheduler, where the
underlying objects are not correctly identified. This instruction uses that
GEP:

STMux %15:grx32bit, %31:addr64bit, 0, %19:addr64bit :: (store 4 into
%ir.uglygep6, !tbaa !2)

but do not give @a and @c as underlying objects. Instead, the search just goes
up through %lsr.iv245. The second sub of the two ptrtoint:s seems to be
ignored.

I wonder:
1. is LSR emitting correct code here?
2. If so, should we handle this case in getUnderlyingObjectsForInstr(), or
should instead the memory operand be dropped and by that make MI alias with
everything?


  %lsr.iv2 = phi [7 x i32]* [ %5, %for.cond1.preheader ], [ %scevgep1,
%for.cond1.preheader.preheader ]
  %lsr.iv = phi i32 [ %lsr.iv.next, %for.cond1.preheader ], [ %2,
%for.cond1.preheader.preheader ]
  %indvars.iv = phi i64 [ %0, %for.cond1.preheader.preheader ], [
%indvars.iv.next, %for.cond1.preheader ]
  %lsr.iv24 = bitcast [7 x i32]* %lsr.iv2 to i32*
  %lsr.iv245 = bitcast i32* %lsr.iv24 to i8*
  %3 = load i32, i32* %lsr.iv24, align 4, !tbaa !2
  store i32 10, i32* getelementptr inbounds ([28 x i32], [28 x i32]* @c, i64 0,
i64 0), align 4, !tbaa !2
  store i32 10, i32* getelementptr inbounds ([28 x i32], [28 x i32]* @c, i64 0,
i64 3), align 4, !tbaa !2
  store i32 10, i32* getelementptr inbounds ([28 x i32], [28 x i32]* @c, i64 0,
i64 6), align 4, !tbaa !2
  store i32 10, i32* getelementptr inbounds ([28 x i32], [28 x i32]* @c, i64 0,
i64 9), align 4, !tbaa !2
  %uglygep = getelementptr i8, i8* %lsr.iv245, i64 sub (i64 ptrtoint ([28 x
i32]* @c to i64), i64 ptrtoint ([7 x i32]* @a to i64))
  %uglygep6 = bitcast i8* %uglygep to i32*

store i32 %3, i32* %uglygep6, align 4, !tbaa !2

All the stores alias with @c, but the last one is not recognized to do so.

llc -mcpu=arch13 -O3 wrong0.ll -stress-ivchain -o -</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>