xref: /llvm-project/llvm/test/Transforms/LoopDistribute/debug-print.ll (revision 915ee0b823a528456226de513f303483d5fe0793)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; REQUIRES: asserts
3; RUN: opt -passes=loop-distribute -enable-loop-distribute \
4; RUN:   -debug-only=loop-distribute -disable-output 2>&1 %s | FileCheck %s
5
6define void @f(ptr noalias %a, ptr noalias %b, ptr noalias %c, ptr noalias %d, i64 %stride) {
7; CHECK-LABEL: 'f'
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;
90entry:
91  br label %for.body
92
93for.body:                                         ; preds = %for.body, %entry
94  %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
95  %gep.a = getelementptr inbounds i32, ptr %a, i64 %ind
96  %load.a = load i32, ptr %gep.a, align 4
97  %gep.b = getelementptr inbounds i32, ptr %b, i64 %ind
98  %load.b = load i32, ptr %gep.b, align 4
99  %mul.a = mul i32 %load.b, %load.a
100  %add = add nuw nsw i64 %ind, 1
101  %gep.a.plus4 = getelementptr inbounds i32, ptr %a, i64 %add
102  store i32 %mul.a, ptr %gep.a.plus4, align 4
103  %gep.d = getelementptr inbounds i32, ptr %d, i64 %ind
104  %loadD = load i32, ptr %gep.d, align 4
105  %mul = mul i64 %ind, %stride
106  %gep.strided.a = getelementptr inbounds i32, ptr %a, i64 %mul
107  %load.strided.a = load i32, ptr %gep.strided.a, align 4
108  %mul.c = mul i32 %loadD, %load.strided.a
109  %gep.c = getelementptr inbounds i32, ptr %c, i64 %ind
110  store i32 %mul.c, ptr %gep.c, align 4
111  %exitcond = icmp eq i64 %add, 20
112  br i1 %exitcond, label %exit, label %for.body
113
114exit:                                             ; preds = %for.body
115  ret void
116}
117