| ; REQUIRES: asserts |
| ; RUN: opt < %s -passes=loop-interchange -verify-dom-info -verify-loop-info \ |
| ; RUN: -disable-output -debug 2>&1 | FileCheck %s |
| |
| ;; In the following case, p0 and p1 may alias, so the direction vector must be [* *]. |
| ;; |
| ;; void may_alias(float *p0, float *p1) { |
| ;; for (int i = 0; i < 4; i++) |
| ;; for (int j = 0; j < 4; j++) |
| ;; p0[4 * i + j] = p1[4 * j + i]; |
| ;; } |
| |
| ; CHECK: Dependency matrix before interchange: |
| ; CHECK-NEXT: * * |
| ; CHECK-NEXT: Processing InnerLoopId = 1 and OuterLoopId = 0 |
| define void @may_alias(ptr %p0, ptr %p1) { |
| entry: |
| br label %for.i.header |
| |
| for.i.header: |
| %i = phi i32 [ 0, %entry ], [ %i.inc, %for.i.latch ] |
| br label %for.j |
| |
| for.j: |
| %j = phi i32 [ 0, %for.i.header ], [ %j.inc, %for.j ] |
| %idx.0 = getelementptr inbounds [4 x [4 x float]], ptr %p0, i32 0, i32 %j, i32 %i |
| %idx.1 = getelementptr inbounds [4 x [4 x float]], ptr %p1, i32 0, i32 %i, i32 %j |
| %0 = load float, ptr %idx.0, align 4 |
| store float %0, ptr %idx.1, align 4 |
| %j.inc = add nuw nsw i32 %j, 1 |
| %cmp.j = icmp slt i32 %j.inc, 4 |
| br i1 %cmp.j, label %for.j, label %for.i.latch |
| |
| for.i.latch: |
| %i.inc = add nuw nsw i32 %i, 1 |
| %cmp.i = icmp slt i32 %i.inc, 4 |
| br i1 %cmp.i, label %for.i.header, label %exit |
| |
| exit: |
| ret void |
| } |