xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/cycled_phis.ll (revision a56ba1fab07b2c9b1d0287bdf56cdad4d54a5f33)
10bd9162fSMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
20bd9162fSMax Kazantsev; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
30bd9162fSMax Kazantsev
40bd9162fSMax Kazantsevdeclare i1 @cond()
50bd9162fSMax Kazantsev
6f909aed6SArthur Eubanks; FIXME: Range of phi_1 and phi_2 here can be sharpened to [10, 21).
70bd9162fSMax Kazantsevdefine void @test_01() {
80bd9162fSMax Kazantsev; CHECK-LABEL: 'test_01'
90bd9162fSMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_01
100bd9162fSMax Kazantsev; CHECK-NEXT:    %phi_1 = phi i32 [ 10, %entry ], [ %phi_2, %loop ]
11*a56ba1faSgoldsteinn; CHECK-NEXT:    --> %phi_1 U: [0,31) S: [0,31) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
120bd9162fSMax Kazantsev; CHECK-NEXT:    %phi_2 = phi i32 [ 20, %entry ], [ %phi_1, %loop ]
13*a56ba1faSgoldsteinn; CHECK-NEXT:    --> %phi_2 U: [0,31) S: [0,31) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
140bd9162fSMax Kazantsev; CHECK-NEXT:    %cond = call i1 @cond()
150bd9162fSMax Kazantsev; CHECK-NEXT:    --> %cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
160bd9162fSMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_01
170bd9162fSMax Kazantsev; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
18211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
19e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
200bd9162fSMax Kazantsev;
210bd9162fSMax Kazantseventry:
220bd9162fSMax Kazantsev  br label %loop
230bd9162fSMax Kazantsev
240bd9162fSMax Kazantsevloop:
250bd9162fSMax Kazantsev  %phi_1 = phi i32 [ 10, %entry], [%phi_2, %loop]
260bd9162fSMax Kazantsev  %phi_2 = phi i32 [ 20, %entry], [%phi_1, %loop]
270bd9162fSMax Kazantsev  %cond = call i1 @cond()
280bd9162fSMax Kazantsev  br i1 %cond, label %loop, label %exit
290bd9162fSMax Kazantsev
300bd9162fSMax Kazantsevexit:
310bd9162fSMax Kazantsev  ret void
320bd9162fSMax Kazantsev}
3300be84f9SMax Kazantsev
3400be84f9SMax Kazantsev; FIXME: Both inner and outer loop Phis should have the same range [0, 3000).
3592619956SNikita Popovdefine void @test_02(ptr %p, ptr %q) {
3600be84f9SMax Kazantsev; CHECK-LABEL: 'test_02'
3700be84f9SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_02
3892619956SNikita Popov; CHECK-NEXT:    %start = load i32, ptr %p, align 4, !range !0
3900be84f9SMax Kazantsev; CHECK-NEXT:    --> %start U: [0,1000) S: [0,1000)
4000be84f9SMax Kazantsev; CHECK-NEXT:    %outer_phi = phi i32 [ %start, %entry ], [ %inner_lcssa, %outer_backedge ]
41f909aed6SArthur Eubanks; CHECK-NEXT:    --> %outer_phi U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Invariant }
4200be84f9SMax Kazantsev; CHECK-NEXT:    %inner_phi = phi i32 [ %outer_phi, %outer_loop ], [ %inner_load, %inner_loop ]
43f909aed6SArthur Eubanks; CHECK-NEXT:    --> %inner_phi U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
4492619956SNikita Popov; CHECK-NEXT:    %inner_load = load i32, ptr %q, align 4, !range !1
4500be84f9SMax Kazantsev; CHECK-NEXT:    --> %inner_load U: [2000,3000) S: [2000,3000) Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
4600be84f9SMax Kazantsev; CHECK-NEXT:    %inner_cond = call i1 @cond()
4700be84f9SMax Kazantsev; CHECK-NEXT:    --> %inner_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
4800be84f9SMax Kazantsev; CHECK-NEXT:    %inner_lcssa = phi i32 [ %inner_phi, %inner_loop ]
4920d798bdSFlorian Hahn; CHECK-NEXT:    --> %inner_phi U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Variant }
5000be84f9SMax Kazantsev; CHECK-NEXT:    %outer_cond = call i1 @cond()
5100be84f9SMax Kazantsev; CHECK-NEXT:    --> %outer_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Invariant }
5200be84f9SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_02
5300be84f9SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable backedge-taken count.
54211d9411SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable constant max backedge-taken count.
55e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable symbolic max backedge-taken count.
5600be84f9SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable backedge-taken count.
57211d9411SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable constant max backedge-taken count.
58e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable symbolic max backedge-taken count.
5900be84f9SMax Kazantsev;
6000be84f9SMax Kazantseventry:
6192619956SNikita Popov  %start = load i32, ptr %p, !range !0
6200be84f9SMax Kazantsev  br label %outer_loop
6300be84f9SMax Kazantsev
6400be84f9SMax Kazantsevouter_loop:
6500be84f9SMax Kazantsev  %outer_phi = phi i32 [ %start, %entry], [%inner_lcssa, %outer_backedge]
6600be84f9SMax Kazantsev  br label %inner_loop
6700be84f9SMax Kazantsev
6800be84f9SMax Kazantsevinner_loop:
6900be84f9SMax Kazantsev  %inner_phi = phi i32 [%outer_phi, %outer_loop], [%inner_load, %inner_loop]
7092619956SNikita Popov  %inner_load = load i32, ptr %q, !range !1
7100be84f9SMax Kazantsev  %inner_cond = call i1 @cond()
7200be84f9SMax Kazantsev  br i1 %inner_cond, label %inner_loop, label %outer_backedge
7300be84f9SMax Kazantsev
7400be84f9SMax Kazantsevouter_backedge:
7500be84f9SMax Kazantsev  %inner_lcssa = phi i32 [%inner_phi, %inner_loop]
7600be84f9SMax Kazantsev  %outer_cond = call i1 @cond()
7700be84f9SMax Kazantsev  br i1 %outer_cond, label %outer_loop, label %exit
7800be84f9SMax Kazantsev
7900be84f9SMax Kazantsevexit:
8000be84f9SMax Kazantsev  ret void
8100be84f9SMax Kazantsev}
8200be84f9SMax Kazantsev
83f909aed6SArthur Eubanks; FIXME: All phis should have range [0, 3000)
8492619956SNikita Popovdefine void @test_03(ptr %p, ptr %q) {
8500be84f9SMax Kazantsev; CHECK-LABEL: 'test_03'
8600be84f9SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_03
8792619956SNikita Popov; CHECK-NEXT:    %start_1 = load i32, ptr %p, align 4, !range !0
8800be84f9SMax Kazantsev; CHECK-NEXT:    --> %start_1 U: [0,1000) S: [0,1000)
8992619956SNikita Popov; CHECK-NEXT:    %start_2 = load i32, ptr %q, align 4, !range !1
9000be84f9SMax Kazantsev; CHECK-NEXT:    --> %start_2 U: [2000,3000) S: [2000,3000)
9100be84f9SMax Kazantsev; CHECK-NEXT:    %outer_phi = phi i32 [ %start_1, %entry ], [ %inner_lcssa, %outer_backedge ]
92f909aed6SArthur Eubanks; CHECK-NEXT:    --> %outer_phi U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Invariant }
9300be84f9SMax Kazantsev; CHECK-NEXT:    %inner_phi_1 = phi i32 [ %outer_phi, %outer_loop ], [ %inner_phi_2, %inner_loop ]
94f909aed6SArthur Eubanks; CHECK-NEXT:    --> %inner_phi_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
9500be84f9SMax Kazantsev; CHECK-NEXT:    %inner_phi_2 = phi i32 [ %start_2, %outer_loop ], [ %inner_phi_1, %inner_loop ]
96f909aed6SArthur Eubanks; CHECK-NEXT:    --> %inner_phi_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
9700be84f9SMax Kazantsev; CHECK-NEXT:    %inner_cond = call i1 @cond()
9800be84f9SMax Kazantsev; CHECK-NEXT:    --> %inner_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner_loop: Variant, %outer_loop: Variant }
9900be84f9SMax Kazantsev; CHECK-NEXT:    %inner_lcssa = phi i32 [ %inner_phi_1, %inner_loop ]
10020d798bdSFlorian Hahn; CHECK-NEXT:    --> %inner_phi_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Variant }
10100be84f9SMax Kazantsev; CHECK-NEXT:    %outer_cond = call i1 @cond()
10200be84f9SMax Kazantsev; CHECK-NEXT:    --> %outer_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer_loop: Variant, %inner_loop: Invariant }
10300be84f9SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_03
10400be84f9SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable backedge-taken count.
105211d9411SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable constant max backedge-taken count.
106e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %inner_loop: Unpredictable symbolic max backedge-taken count.
10700be84f9SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable backedge-taken count.
108211d9411SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable constant max backedge-taken count.
109e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %outer_loop: Unpredictable symbolic max backedge-taken count.
11000be84f9SMax Kazantsev;
11100be84f9SMax Kazantseventry:
11292619956SNikita Popov  %start_1 = load i32, ptr %p, !range !0
11392619956SNikita Popov  %start_2 = load i32, ptr %q, !range !1
11400be84f9SMax Kazantsev  br label %outer_loop
11500be84f9SMax Kazantsev
11600be84f9SMax Kazantsevouter_loop:
11700be84f9SMax Kazantsev  %outer_phi = phi i32 [ %start_1, %entry], [%inner_lcssa, %outer_backedge]
11800be84f9SMax Kazantsev  br label %inner_loop
11900be84f9SMax Kazantsev
12000be84f9SMax Kazantsevinner_loop:
12100be84f9SMax Kazantsev  %inner_phi_1 = phi i32 [%outer_phi, %outer_loop], [%inner_phi_2, %inner_loop]
12200be84f9SMax Kazantsev  %inner_phi_2 = phi i32 [%start_2, %outer_loop], [%inner_phi_1, %inner_loop]
12300be84f9SMax Kazantsev  %inner_cond = call i1 @cond()
12400be84f9SMax Kazantsev  br i1 %inner_cond, label %inner_loop, label %outer_backedge
12500be84f9SMax Kazantsev
12600be84f9SMax Kazantsevouter_backedge:
12700be84f9SMax Kazantsev  %inner_lcssa = phi i32 [%inner_phi_1, %inner_loop]
12800be84f9SMax Kazantsev  %outer_cond = call i1 @cond()
12900be84f9SMax Kazantsev  br i1 %outer_cond, label %outer_loop, label %exit
13000be84f9SMax Kazantsev
13100be84f9SMax Kazantsevexit:
13200be84f9SMax Kazantsev  ret void
13300be84f9SMax Kazantsev}
13400be84f9SMax Kazantsev
13500be84f9SMax Kazantsev!0 = !{i32 0, i32 1000}
13600be84f9SMax Kazantsev!1 = !{i32 2000, i32 3000}
137