1d896f22fSArthur Eubanks; RUN: opt %s -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s 238540d71SPhilip Reames 338540d71SPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 438540d71SPhilip Reamestarget triple = "x86_64-unknown-linux-gnu" 538540d71SPhilip Reames 638540d71SPhilip Reames; A collection of tests focused on exercising logic to prove no-unsigned wrap 738540d71SPhilip Reames; from mustprogress semantics of loops. 838540d71SPhilip Reames 938540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test 1038540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (2 umax %N)) /u 2) 1138540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_preinc 1238540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((1 + %N) /u 2) 1338540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_st 1438540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 1538540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_well_defined_infinite_ld 1638540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 1738540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_no_mustprogress 1838540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 1938540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_1024 2038540d71SPhilip Reames; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024) 2138540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_uneven_divide 2238540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2338540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_non_invariant_rhs 2438540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2538540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_abnormal_exit 2638540d71SPhilip Reames; CHECK: Loop %for.body: Unpredictable backedge-taken count. 2738540d71SPhilip Reames; CHECK: Determining loop execution counts for: @test_other_exit 2838540d71SPhilip Reames; CHECK: Loop %for.body: <multiple exits> Unpredictable backedge-taken count. 291f40870dSEli Friedman; CHECK: Determining loop execution counts for: @test_gt 301f40870dSEli Friedman; CHECK: Loop %for.body: Unpredictable backedge-taken count. 310d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_willreturn 320d04c778SWilliam S. Moses; CHECK: Loop %for.body: backedge-taken count is ((-1 + (1024 umax %N)) /u 1024) 330d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_nowillreturn 340d04c778SWilliam S. Moses; CHECK: Loop %for.body: Unpredictable backedge-taken count. 350d04c778SWilliam S. Moses; TODO: investigate why willreturn is still needed on the callsite 360d04c778SWilliam S. Moses; CHECK: Determining loop execution counts for: @test_willreturn_nocallsite 370d04c778SWilliam S. Moses; CHECK: Loop %for.body: Unpredictable backedge-taken count. 3838540d71SPhilip Reames 3938540d71SPhilip Reamesdefine void @test(i32 %N) mustprogress { 4038540d71SPhilip Reamesentry: 4138540d71SPhilip Reames br label %for.body 4238540d71SPhilip Reames 4338540d71SPhilip Reamesfor.body: 4438540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 4538540d71SPhilip Reames %iv.next = add i32 %iv, 2 4638540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 4738540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 4838540d71SPhilip Reames 4938540d71SPhilip Reamesfor.cond.cleanup: 5038540d71SPhilip Reames ret void 5138540d71SPhilip Reames} 5238540d71SPhilip Reames 5338540d71SPhilip Reamesdefine void @test_preinc(i32 %N) mustprogress { 5438540d71SPhilip Reamesentry: 5538540d71SPhilip Reames br label %for.body 5638540d71SPhilip Reames 5738540d71SPhilip Reamesfor.body: 5838540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 5938540d71SPhilip Reames %iv.next = add i32 %iv, 2 6038540d71SPhilip Reames %cmp = icmp ult i32 %iv, %N 6138540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 6238540d71SPhilip Reames 6338540d71SPhilip Reamesfor.cond.cleanup: 6438540d71SPhilip Reames ret void 6538540d71SPhilip Reames 6638540d71SPhilip Reames} 6738540d71SPhilip Reames 6838540d71SPhilip Reames@G = external global i32 6938540d71SPhilip Reames 7038540d71SPhilip Reamesdefine void @test_well_defined_infinite_st(i32 %N) mustprogress { 7138540d71SPhilip Reamesentry: 7238540d71SPhilip Reames br label %for.body 7338540d71SPhilip Reames 7438540d71SPhilip Reamesfor.body: 7538540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 7638540d71SPhilip Reames %iv.next = add i32 %iv, 2 77*92619956SNikita Popov store volatile i32 0, ptr @G 7838540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 7938540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 8038540d71SPhilip Reames 8138540d71SPhilip Reamesfor.cond.cleanup: 8238540d71SPhilip Reames ret void 8338540d71SPhilip Reames} 8438540d71SPhilip Reames 8538540d71SPhilip Reamesdefine void @test_well_defined_infinite_ld(i32 %N) mustprogress { 8638540d71SPhilip Reamesentry: 8738540d71SPhilip Reames br label %for.body 8838540d71SPhilip Reames 8938540d71SPhilip Reamesfor.body: 9038540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 9138540d71SPhilip Reames %iv.next = add i32 %iv, 2 92*92619956SNikita Popov %val = load volatile i32, ptr @G 9338540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 9438540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 9538540d71SPhilip Reames 9638540d71SPhilip Reamesfor.cond.cleanup: 9738540d71SPhilip Reames ret void 9838540d71SPhilip Reames} 9938540d71SPhilip Reames 10038540d71SPhilip Reamesdefine void @test_no_mustprogress(i32 %N) { 10138540d71SPhilip Reamesentry: 10238540d71SPhilip Reames br label %for.body 10338540d71SPhilip Reames 10438540d71SPhilip Reamesfor.body: 10538540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 10638540d71SPhilip Reames %iv.next = add i32 %iv, 2 10738540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 10838540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 10938540d71SPhilip Reames 11038540d71SPhilip Reamesfor.cond.cleanup: 11138540d71SPhilip Reames ret void 11238540d71SPhilip Reames 11338540d71SPhilip Reames} 11438540d71SPhilip Reames 11538540d71SPhilip Reames 11638540d71SPhilip Reamesdefine void @test_1024(i32 %N) mustprogress { 11738540d71SPhilip Reamesentry: 11838540d71SPhilip Reames br label %for.body 11938540d71SPhilip Reames 12038540d71SPhilip Reamesfor.body: 12138540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 12238540d71SPhilip Reames %iv.next = add i32 %iv, 1024 12338540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 12438540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 12538540d71SPhilip Reames 12638540d71SPhilip Reamesfor.cond.cleanup: 12738540d71SPhilip Reames ret void 12838540d71SPhilip Reames} 12938540d71SPhilip Reames 13038540d71SPhilip Reamesdefine void @test_uneven_divide(i32 %N) mustprogress { 13138540d71SPhilip Reamesentry: 13238540d71SPhilip Reames br label %for.body 13338540d71SPhilip Reames 13438540d71SPhilip Reamesfor.body: 13538540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 13638540d71SPhilip Reames %iv.next = add i32 %iv, 3 13738540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 13838540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 13938540d71SPhilip Reames 14038540d71SPhilip Reamesfor.cond.cleanup: 14138540d71SPhilip Reames ret void 14238540d71SPhilip Reames} 14338540d71SPhilip Reames 14438540d71SPhilip Reamesdefine void @test_non_invariant_rhs() mustprogress { 14538540d71SPhilip Reamesentry: 14638540d71SPhilip Reames br label %for.body 14738540d71SPhilip Reames 14838540d71SPhilip Reamesfor.body: 14938540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 15038540d71SPhilip Reames %iv.next = add i32 %iv, 2 151*92619956SNikita Popov %N = load i32, ptr @G 15238540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 15338540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 15438540d71SPhilip Reames 15538540d71SPhilip Reamesfor.cond.cleanup: 15638540d71SPhilip Reames ret void 15738540d71SPhilip Reames} 15838540d71SPhilip Reames 15938540d71SPhilip Reamesdeclare void @mayexit() 16038540d71SPhilip Reames 16138540d71SPhilip Reamesdefine void @test_abnormal_exit(i32 %N) mustprogress { 16238540d71SPhilip Reamesentry: 16338540d71SPhilip Reames br label %for.body 16438540d71SPhilip Reames 16538540d71SPhilip Reamesfor.body: 16638540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 16738540d71SPhilip Reames %iv.next = add i32 %iv, 2 16838540d71SPhilip Reames call void @mayexit() 16938540d71SPhilip Reames %cmp = icmp ult i32 %iv.next, %N 17038540d71SPhilip Reames br i1 %cmp, label %for.body, label %for.cond.cleanup 17138540d71SPhilip Reames 17238540d71SPhilip Reamesfor.cond.cleanup: 17338540d71SPhilip Reames ret void 17438540d71SPhilip Reames} 17538540d71SPhilip Reames 17638540d71SPhilip Reames 17738540d71SPhilip Reamesdefine void @test_other_exit(i32 %N) mustprogress { 17838540d71SPhilip Reamesentry: 17938540d71SPhilip Reames br label %for.body 18038540d71SPhilip Reames 18138540d71SPhilip Reamesfor.body: 18238540d71SPhilip Reames %iv = phi i32 [ %iv.next, %for.latch ], [ 0, %entry ] 18338540d71SPhilip Reames %iv.next = add i32 %iv, 2 18438540d71SPhilip Reames %cmp1 = icmp ult i32 %iv.next, 20 18538540d71SPhilip Reames br i1 %cmp1, label %for.latch, label %for.cond.cleanup 18638540d71SPhilip Reames 18738540d71SPhilip Reamesfor.latch: 18838540d71SPhilip Reames %cmp2 = icmp ult i32 %iv.next, %N 18938540d71SPhilip Reames br i1 %cmp2, label %for.body, label %for.cond.cleanup 19038540d71SPhilip Reames 19138540d71SPhilip Reamesfor.cond.cleanup: 19238540d71SPhilip Reames ret void 19338540d71SPhilip Reames} 19438540d71SPhilip Reames 1951f40870dSEli Friedmandefine void @test_gt(i32 %S, i32 %N) mustprogress { 1961f40870dSEli Friedmanentry: 1971f40870dSEli Friedman br label %for.body 19838540d71SPhilip Reames 1991f40870dSEli Friedmanfor.body: 2001f40870dSEli Friedman %iv = phi i32 [ %iv.next, %for.body ], [ %S, %entry ] 2011f40870dSEli Friedman %iv.next = add i32 %iv, -2 2021f40870dSEli Friedman %cmp = icmp ugt i32 %iv.next, %N 2031f40870dSEli Friedman br i1 %cmp, label %for.body, label %for.cond.cleanup 2041f40870dSEli Friedman 2051f40870dSEli Friedmanfor.cond.cleanup: 2061f40870dSEli Friedman ret void 2071f40870dSEli Friedman} 2080d04c778SWilliam S. Moses 2090d04c778SWilliam S. Mosesdeclare void @sideeffect() 2100d04c778SWilliam S. Moses 2110d04c778SWilliam S. Mosesdefine void @test_willreturn(i32 %S, i32 %N) willreturn { 2120d04c778SWilliam S. Mosesentry: 2130d04c778SWilliam S. Moses br label %for.body 2140d04c778SWilliam S. Moses 2150d04c778SWilliam S. Mosesfor.body: 2160d04c778SWilliam S. Moses %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 2170d04c778SWilliam S. Moses %iv.next = add i32 %iv, 1024 2180d04c778SWilliam S. Moses call void @sideeffect() nounwind willreturn 2190d04c778SWilliam S. Moses %cmp = icmp ult i32 %iv.next, %N 2200d04c778SWilliam S. Moses br i1 %cmp, label %for.body, label %for.cond.cleanup 2210d04c778SWilliam S. Moses 2220d04c778SWilliam S. Mosesfor.cond.cleanup: 2230d04c778SWilliam S. Moses ret void 2240d04c778SWilliam S. Moses} 2250d04c778SWilliam S. Moses 2260d04c778SWilliam S. Mosesdefine void @test_nowillreturn(i32 %S, i32 %N) { 2270d04c778SWilliam S. Mosesentry: 2280d04c778SWilliam S. Moses br label %for.body 2290d04c778SWilliam S. Moses 2300d04c778SWilliam S. Mosesfor.body: 2310d04c778SWilliam S. Moses %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 2320d04c778SWilliam S. Moses %iv.next = add i32 %iv, 1024 2330d04c778SWilliam S. Moses call void @sideeffect() nounwind willreturn 2340d04c778SWilliam S. Moses %cmp = icmp ult i32 %iv.next, %N 2350d04c778SWilliam S. Moses br i1 %cmp, label %for.body, label %for.cond.cleanup 2360d04c778SWilliam S. Moses 2370d04c778SWilliam S. Mosesfor.cond.cleanup: 2380d04c778SWilliam S. Moses ret void 2390d04c778SWilliam S. Moses} 2400d04c778SWilliam S. Moses 2410d04c778SWilliam S. Mosesdefine void @test_willreturn_nocallsite(i32 %S, i32 %N) willreturn { 2420d04c778SWilliam S. Mosesentry: 2430d04c778SWilliam S. Moses br label %for.body 2440d04c778SWilliam S. Moses 2450d04c778SWilliam S. Mosesfor.body: 2460d04c778SWilliam S. Moses %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 2470d04c778SWilliam S. Moses %iv.next = add i32 %iv, 1024 2480d04c778SWilliam S. Moses call void @sideeffect() nounwind 2490d04c778SWilliam S. Moses %cmp = icmp ult i32 %iv.next, %N 2500d04c778SWilliam S. Moses br i1 %cmp, label %for.body, label %for.cond.cleanup 2510d04c778SWilliam S. Moses 2520d04c778SWilliam S. Mosesfor.cond.cleanup: 2530d04c778SWilliam S. Moses ret void 2540d04c778SWilliam S. Moses} 255