|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 |
1 | 2 | ; REQUIRES: asserts
|
2 | 3 | ; RUN: opt -passes=loop-distribute -enable-loop-distribute \
|
3 | 4 | ; RUN: -debug-only=loop-distribute -disable-output 2>&1 %s | FileCheck %s
|
4 | 5 |
|
5 | 6 | define void @f(ptr noalias %a, ptr noalias %b, ptr noalias %c, ptr noalias %d, i64 %stride) {
|
6 | 7 | ; CHECK-LABEL: 'f'
|
7 |
| -; CHECK: LDist: Found a candidate loop: for.body |
8 |
| -; CHECK: Backward dependences: |
9 |
| -; CHECK-NEXT: Backward: |
10 |
| -; CHECK-NEXT: %load.a = load i32, ptr %gep.a, align 4 -> |
11 |
| -; CHECK-NEXT: store i32 %mul.a, ptr %gep.a.plus4, align 4 |
12 |
| -; CHECK: Seeded partitions: |
13 |
| -; CHECK: Partition 0 |
14 |
| -; CHECK: Partition 1 |
15 |
| -; CHECK: Partition 2 |
16 |
| -; CHECK: Partition 3 |
17 |
| -; CHECK: Distributing loop |
| 8 | +; CHECK-NEXT: LDist: Found a candidate loop: for.body |
| 9 | +; CHECK-NEXT: LDist: Backward dependences: |
| 10 | +; CHECK-NEXT: Backward: |
| 11 | +; CHECK-NEXT: %load.a = load i32, ptr %gep.a, align 4 -> |
| 12 | +; CHECK-NEXT: store i32 %mul.a, ptr %gep.a.plus4, align 4 |
| 13 | +; CHECK-NEXT: LDist: Seeded partitions: |
| 14 | +; CHECK-NEXT: LDist: Partition 0: (cycle) |
| 15 | +; CHECK-NEXT: for.body: %load.a = load i32, ptr %gep.a, align 4 |
| 16 | +; CHECK-NEXT: for.body: %load.b = load i32, ptr %gep.b, align 4 |
| 17 | +; CHECK-NEXT: for.body: store i32 %mul.a, ptr %gep.a.plus4, align 4 |
| 18 | +; CHECK-NEXT: LDist: Partition 1: |
| 19 | +; CHECK-NEXT: for.body: %loadD = load i32, ptr %gep.d, align 4 |
| 20 | +; CHECK-NEXT: LDist: Partition 2: |
| 21 | +; CHECK-NEXT: for.body: %load.strided.a = load i32, ptr %gep.strided.a, align 4 |
| 22 | +; CHECK-NEXT: LDist: Partition 3: |
| 23 | +; CHECK-NEXT: for.body: store i32 %mul.c, ptr %gep.c, align 4 |
| 24 | +; CHECK-NEXT: LDist: Merged partitions: |
| 25 | +; CHECK-NEXT: LDist: Partition 0: (cycle) |
| 26 | +; CHECK-NEXT: for.body: %load.a = load i32, ptr %gep.a, align 4 |
| 27 | +; CHECK-NEXT: for.body: %load.b = load i32, ptr %gep.b, align 4 |
| 28 | +; CHECK-NEXT: for.body: store i32 %mul.a, ptr %gep.a.plus4, align 4 |
| 29 | +; CHECK-NEXT: LDist: Partition 1: |
| 30 | +; CHECK-NEXT: for.body: %loadD = load i32, ptr %gep.d, align 4 |
| 31 | +; CHECK-NEXT: for.body: %load.strided.a = load i32, ptr %gep.strided.a, align 4 |
| 32 | +; CHECK-NEXT: for.body: store i32 %mul.c, ptr %gep.c, align 4 |
| 33 | +; CHECK-NEXT: LDist: Populated partitions: |
| 34 | +; CHECK-NEXT: LDist: Partition 0: (cycle) |
| 35 | +; CHECK-NEXT: for.body: %load.a = load i32, ptr %gep.a, align 4 |
| 36 | +; CHECK-NEXT: for.body: %load.b = load i32, ptr %gep.b, align 4 |
| 37 | +; CHECK-NEXT: for.body: store i32 %mul.a, ptr %gep.a.plus4, align 4 |
| 38 | +; CHECK-NEXT: for.body: br i1 %exitcond, label %exit, label %for.body |
| 39 | +; CHECK-NEXT: for.body: %exitcond = icmp eq i64 %add, 20 |
| 40 | +; CHECK-NEXT: for.body: %add = add nuw nsw i64 %ind, 1 |
| 41 | +; CHECK-NEXT: for.body: %ind = phi i64 [ 0, %entry ], [ %add, %for.body ] |
| 42 | +; CHECK-NEXT: for.body: %mul.a = mul i32 %load.b, %load.a |
| 43 | +; CHECK-NEXT: for.body: %gep.a.plus4 = getelementptr inbounds i32, ptr %a, i64 %add |
| 44 | +; CHECK-NEXT: for.body: %gep.b = getelementptr inbounds i32, ptr %b, i64 %ind |
| 45 | +; CHECK-NEXT: for.body: %gep.a = getelementptr inbounds i32, ptr %a, i64 %ind |
| 46 | +; CHECK-NEXT: LDist: Partition 1: |
| 47 | +; CHECK-NEXT: for.body: %loadD = load i32, ptr %gep.d, align 4 |
| 48 | +; CHECK-NEXT: for.body: %load.strided.a = load i32, ptr %gep.strided.a, align 4 |
| 49 | +; CHECK-NEXT: for.body: store i32 %mul.c, ptr %gep.c, align 4 |
| 50 | +; CHECK-NEXT: for.body: br i1 %exitcond, label %exit, label %for.body |
| 51 | +; CHECK-NEXT: for.body: %exitcond = icmp eq i64 %add, 20 |
| 52 | +; CHECK-NEXT: for.body: %add = add nuw nsw i64 %ind, 1 |
| 53 | +; CHECK-NEXT: for.body: %ind = phi i64 [ 0, %entry ], [ %add, %for.body ] |
| 54 | +; CHECK-NEXT: for.body: %mul.c = mul i32 %loadD, %load.strided.a |
| 55 | +; CHECK-NEXT: for.body: %gep.c = getelementptr inbounds i32, ptr %c, i64 %ind |
| 56 | +; CHECK-NEXT: for.body: %gep.strided.a = getelementptr inbounds i32, ptr %a, i64 %mul |
| 57 | +; CHECK-NEXT: for.body: %mul = mul i64 %ind, %stride |
| 58 | +; CHECK-NEXT: for.body: %gep.d = getelementptr inbounds i32, ptr %d, i64 %ind |
| 59 | +; CHECK-NEXT: LDist: Distributing loop: for.body |
| 60 | +; CHECK-NEXT: LDist: Pointers: |
| 61 | +; CHECK-NEXT: LDist: After removing unused Instrs: |
| 62 | +; CHECK-NEXT: LDist: Partition 0: |
| 63 | +; CHECK-NEXT: for.body.ldist1: ; preds = %for.body.ldist1, %for.body.ph.ldist1 |
| 64 | +; CHECK-NEXT: %ind.ldist1 = phi i64 [ 0, %for.body.ph.ldist1 ], [ %add.ldist1, %for.body.ldist1 ] |
| 65 | +; CHECK-NEXT: %gep.a.ldist1 = getelementptr inbounds i32, ptr %a, i64 %ind.ldist1 |
| 66 | +; CHECK-NEXT: %load.a.ldist1 = load i32, ptr %gep.a.ldist1, align 4 |
| 67 | +; CHECK-NEXT: %gep.b.ldist1 = getelementptr inbounds i32, ptr %b, i64 %ind.ldist1 |
| 68 | +; CHECK-NEXT: %load.b.ldist1 = load i32, ptr %gep.b.ldist1, align 4 |
| 69 | +; CHECK-NEXT: %mul.a.ldist1 = mul i32 %load.b.ldist1, %load.a.ldist1 |
| 70 | +; CHECK-NEXT: %add.ldist1 = add nuw nsw i64 %ind.ldist1, 1 |
| 71 | +; CHECK-NEXT: %gep.a.plus4.ldist1 = getelementptr inbounds i32, ptr %a, i64 %add.ldist1 |
| 72 | +; CHECK-NEXT: store i32 %mul.a.ldist1, ptr %gep.a.plus4.ldist1, align 4 |
| 73 | +; CHECK-NEXT: %exitcond.ldist1 = icmp eq i64 %add.ldist1, 20 |
| 74 | +; CHECK-NEXT: br i1 %exitcond.ldist1, label %for.body.ph, label %for.body.ldist1 |
| 75 | +; CHECK-NEXT: LDist: Partition 1: |
| 76 | +; CHECK-NEXT: for.body: ; preds = %for.body, %for.body.ph |
| 77 | +; CHECK-NEXT: %ind = phi i64 [ 0, %for.body.ph ], [ %add, %for.body ] |
| 78 | +; CHECK-NEXT: %add = add nuw nsw i64 %ind, 1 |
| 79 | +; CHECK-NEXT: %gep.d = getelementptr inbounds i32, ptr %d, i64 %ind |
| 80 | +; CHECK-NEXT: %loadD = load i32, ptr %gep.d, align 4 |
| 81 | +; CHECK-NEXT: %mul = mul i64 %ind, %stride |
| 82 | +; CHECK-NEXT: %gep.strided.a = getelementptr inbounds i32, ptr %a, i64 %mul |
| 83 | +; CHECK-NEXT: %load.strided.a = load i32, ptr %gep.strided.a, align 4 |
| 84 | +; CHECK-NEXT: %mul.c = mul i32 %loadD, %load.strided.a |
| 85 | +; CHECK-NEXT: %gep.c = getelementptr inbounds i32, ptr %c, i64 %ind |
| 86 | +; CHECK-NEXT: store i32 %mul.c, ptr %gep.c, align 4 |
| 87 | +; CHECK-NEXT: %exitcond = icmp eq i64 %add, 20 |
| 88 | +; CHECK-NEXT: br i1 %exitcond, label %exit.loopexit1, label %for.body |
| 89 | +; |
18 | 90 | entry:
|
19 | 91 | br label %for.body
|
20 | 92 |
|
|
0 commit comments