138540d71SPhilip Reames 238540d71SPhilip Reames; RUN: opt %s -analyze -scalar-evolution -enable-new-pm=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s 338540d71SPhilip Reames 438540d71SPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 538540d71SPhilip Reamestarget triple = "x86_64-unknown-linux-gnu" 638540d71SPhilip Reames 738540d71SPhilip Reames; A collection of tests focused on exercising logic to prove no-unsigned wrap 838540d71SPhilip Reames; from mustprogress semantics of loops. 938540d71SPhilip Reames 1038540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test 1138540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (2 umax %N)) /u 2) 1238540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_preinc 1338540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((1 + %N) /u 2) 1438540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_st 1538540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 1638540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_ld 1738540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 1838540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_no_mustprogress 1938540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2038540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_1024 2138540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024) 2238540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_uneven_divide 2338540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2438540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_non_invariant_rhs 2538540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2638540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_abnormal_exit 2738540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2838540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_other_exit 2938540d71SPhilip Reames; CHECK: Loop %for.body: <multiple exits> Unpredictable backedge-taken count. 30*1f40870dSEli Friedman; CHECK: Determining loop execution counts for: @test_gt 31*1f40870dSEli Friedman; CHECK: Loop %for.body: Unpredictable backedge-taken count. 3238540d71SPhilip Reames 3338540d71SPhilip Reamesdefine void @test(i32 %N) mustprogress { 3438540d71SPhilip Reamesentry: 3538540d71SPhilip Reames br label %for.body 3638540d71SPhilip Reames 3738540d71SPhilip Reamesfor.body: 3838540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 3938540d71SPhilip Reames %iv.next = add i32 %iv, 2 4038540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 4138540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 4238540d71SPhilip Reames 4338540d71SPhilip Reamesfor.cond.cleanup: 4438540d71SPhilip Reames ret void 4538540d71SPhilip Reames} 4638540d71SPhilip Reames 4738540d71SPhilip Reamesdefine void @test_preinc(i32 %N) mustprogress { 4838540d71SPhilip Reamesentry: 4938540d71SPhilip Reames br label %for.body 5038540d71SPhilip Reames 5138540d71SPhilip Reamesfor.body: 5238540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 5338540d71SPhilip Reames %iv.next = add i32 %iv, 2 5438540d71SPhilip Reames %cmp = icmp ult i32 %iv, %N 5538540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 5638540d71SPhilip Reames 5738540d71SPhilip Reamesfor.cond.cleanup: 5838540d71SPhilip Reames ret void 5938540d71SPhilip Reames 6038540d71SPhilip Reames} 6138540d71SPhilip Reames 6238540d71SPhilip Reames@G = external global i32 6338540d71SPhilip Reames 6438540d71SPhilip Reamesdefine void @test_well_defined_infinite_st(i32 %N) mustprogress { 6538540d71SPhilip Reamesentry: 6638540d71SPhilip Reames br label %for.body 6738540d71SPhilip Reames 6838540d71SPhilip Reamesfor.body: 6938540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 7038540d71SPhilip Reames %iv.next = add i32 %iv, 2 7138540d71SPhilip Reames store volatile i32 0, i32* @G 7238540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 7338540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 7438540d71SPhilip Reames 7538540d71SPhilip Reamesfor.cond.cleanup: 7638540d71SPhilip Reames ret void 7738540d71SPhilip Reames} 7838540d71SPhilip Reames 7938540d71SPhilip Reamesdefine void @test_well_defined_infinite_ld(i32 %N) mustprogress { 8038540d71SPhilip Reamesentry: 8138540d71SPhilip Reames br label %for.body 8238540d71SPhilip Reames 8338540d71SPhilip Reamesfor.body: 8438540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 8538540d71SPhilip Reames %iv.next = add i32 %iv, 2 8638540d71SPhilip Reames %val = load volatile i32, i32* @G 8738540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 8838540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 8938540d71SPhilip Reames 9038540d71SPhilip Reamesfor.cond.cleanup: 9138540d71SPhilip Reames ret void 9238540d71SPhilip Reames} 9338540d71SPhilip Reames 9438540d71SPhilip Reamesdefine void @test_no_mustprogress(i32 %N) { 9538540d71SPhilip Reamesentry: 9638540d71SPhilip Reames br label %for.body 9738540d71SPhilip Reames 9838540d71SPhilip Reamesfor.body: 9938540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 10038540d71SPhilip Reames %iv.next = add i32 %iv, 2 10138540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 10238540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 10338540d71SPhilip Reames 10438540d71SPhilip Reamesfor.cond.cleanup: 10538540d71SPhilip Reames ret void 10638540d71SPhilip Reames 10738540d71SPhilip Reames} 10838540d71SPhilip Reames 10938540d71SPhilip Reames 11038540d71SPhilip Reamesdefine void @test_1024(i32 %N) mustprogress { 11138540d71SPhilip Reamesentry: 11238540d71SPhilip Reames br label %for.body 11338540d71SPhilip Reames 11438540d71SPhilip Reamesfor.body: 11538540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 11638540d71SPhilip Reames %iv.next = add i32 %iv, 1024 11738540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 11838540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 11938540d71SPhilip Reames 12038540d71SPhilip Reamesfor.cond.cleanup: 12138540d71SPhilip Reames ret void 12238540d71SPhilip Reames} 12338540d71SPhilip Reames 12438540d71SPhilip Reamesdefine void @test_uneven_divide(i32 %N) mustprogress { 12538540d71SPhilip Reamesentry: 12638540d71SPhilip Reames br label %for.body 12738540d71SPhilip Reames 12838540d71SPhilip Reamesfor.body: 12938540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 13038540d71SPhilip Reames %iv.next = add i32 %iv, 3 13138540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 13238540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 13338540d71SPhilip Reames 13438540d71SPhilip Reamesfor.cond.cleanup: 13538540d71SPhilip Reames ret void 13638540d71SPhilip Reames} 13738540d71SPhilip Reames 13838540d71SPhilip Reamesdefine void @test_non_invariant_rhs() mustprogress { 13938540d71SPhilip Reamesentry: 14038540d71SPhilip Reames br label %for.body 14138540d71SPhilip Reames 14238540d71SPhilip Reamesfor.body: 14338540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 14438540d71SPhilip Reames %iv.next = add i32 %iv, 2 14538540d71SPhilip Reames %N = load i32, i32* @G 14638540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 14738540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 14838540d71SPhilip Reames 14938540d71SPhilip Reamesfor.cond.cleanup: 15038540d71SPhilip Reames ret void 15138540d71SPhilip Reames} 15238540d71SPhilip Reames 15338540d71SPhilip Reamesdeclare void @mayexit() 15438540d71SPhilip Reames 15538540d71SPhilip Reamesdefine void @test_abnormal_exit(i32 %N) mustprogress { 15638540d71SPhilip Reamesentry: 15738540d71SPhilip Reames br label %for.body 15838540d71SPhilip Reames 15938540d71SPhilip Reamesfor.body: 16038540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 16138540d71SPhilip Reames %iv.next = add i32 %iv, 2 16238540d71SPhilip Reames call void @mayexit() 16338540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 16438540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 16538540d71SPhilip Reames 16638540d71SPhilip Reamesfor.cond.cleanup: 16738540d71SPhilip Reames ret void 16838540d71SPhilip Reames} 16938540d71SPhilip Reames 17038540d71SPhilip Reames 17138540d71SPhilip Reamesdefine void @test_other_exit(i32 %N) mustprogress { 17238540d71SPhilip Reamesentry: 17338540d71SPhilip Reames br label %for.body 17438540d71SPhilip Reames 17538540d71SPhilip Reamesfor.body: 17638540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.latch ], [ 0, %entry ] 17738540d71SPhilip Reames %iv.next = add i32 %iv, 2 17838540d71SPhilip Reames %cmp1 = icmp ult i32 %iv.next, 20 17938540d71SPhilip Reames br i1 %cmp1, label %for.latch, label %for.cond.cleanup 18038540d71SPhilip Reames 18138540d71SPhilip Reamesfor.latch: 18238540d71SPhilip Reames %cmp2 = icmp ult i32 %iv.next, %N 18338540d71SPhilip Reames br i1 %cmp2, label %for.body, label %for.cond.cleanup 18438540d71SPhilip Reames 18538540d71SPhilip Reamesfor.cond.cleanup: 18638540d71SPhilip Reames ret void 18738540d71SPhilip Reames} 18838540d71SPhilip Reames 189*1f40870dSEli Friedmandefine void @test_gt(i32 %S, i32 %N) mustprogress { 190*1f40870dSEli Friedmanentry: 191*1f40870dSEli Friedman br label %for.body 19238540d71SPhilip Reames 193*1f40870dSEli Friedmanfor.body: 194*1f40870dSEli Friedman %iv = phi i32 [ %iv.next, %for.body ], [ %S, %entry ] 195*1f40870dSEli Friedman %iv.next = add i32 %iv, -2 196*1f40870dSEli Friedman %cmp = icmp ugt i32 %iv.next, %N 197*1f40870dSEli Friedman br i1 %cmp, label %for.body, label %for.cond.cleanup 198*1f40870dSEli Friedman 199*1f40870dSEli Friedmanfor.cond.cleanup: 200*1f40870dSEli Friedman ret void 201*1f40870dSEli Friedman} 202