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