1df3d70b5SDavid Sherwood; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2df3d70b5SDavid Sherwood; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s 3df3d70b5SDavid Sherwood 4df3d70b5SDavid Sherwood 5df3d70b5SDavid Sherwooddefine i32 @multiple_exits_with_predicates(ptr %src1, ptr readonly %src2, i32 %end) { 6df3d70b5SDavid Sherwood; CHECK-LABEL: 'multiple_exits_with_predicates' 7df3d70b5SDavid Sherwood; CHECK-NEXT: Determining loop execution counts for: @multiple_exits_with_predicates 8df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %for.body: <multiple exits> Unpredictable backedge-taken count. 9df3d70b5SDavid Sherwood; CHECK-NEXT: exit count for for.body: ***COULDNOTCOMPUTE*** 10df3d70b5SDavid Sherwood; CHECK-NEXT: predicated exit count for for.body: i32 1023 11df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 12df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 13df3d70b5SDavid Sherwood; CHECK-EMPTY: 14df3d70b5SDavid Sherwood; CHECK-NEXT: exit count for for.work: ***COULDNOTCOMPUTE*** 15df3d70b5SDavid Sherwood; CHECK-NEXT: exit count for for.inc: ***COULDNOTCOMPUTE*** 16df3d70b5SDavid Sherwood; CHECK-NEXT: predicated exit count for for.inc: (-1 + (1 umax %end)) 17df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 18df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 19df3d70b5SDavid Sherwood; CHECK-EMPTY: 20df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 21df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 22df3d70b5SDavid Sherwood; CHECK-NEXT: symbolic max exit count for for.body: ***COULDNOTCOMPUTE*** 23df3d70b5SDavid Sherwood; CHECK-NEXT: predicated symbolic max exit count for for.body: i32 1023 24df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 25df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 26df3d70b5SDavid Sherwood; CHECK-EMPTY: 27df3d70b5SDavid Sherwood; CHECK-NEXT: symbolic max exit count for for.work: ***COULDNOTCOMPUTE*** 28df3d70b5SDavid Sherwood; CHECK-NEXT: symbolic max exit count for for.inc: ***COULDNOTCOMPUTE*** 29df3d70b5SDavid Sherwood; CHECK-NEXT: predicated symbolic max exit count for for.inc: (-1 + (1 umax %end)) 30df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 31df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 32df3d70b5SDavid Sherwood; CHECK-EMPTY: 33*02ee96ecSDavid Sherwood; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i32 1023 34*02ee96ecSDavid Sherwood; CHECK-NEXT: Predicates: 35*02ee96ecSDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 36*02ee96ecSDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 37df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (1023 umin (-1 + (1 umax %end))) 38df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 39df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 40df3d70b5SDavid Sherwood; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw> 41df3d70b5SDavid Sherwood; 42df3d70b5SDavid Sherwoodentry: 43df3d70b5SDavid Sherwood br label %for.body 44df3d70b5SDavid Sherwood 45df3d70b5SDavid Sherwoodfor.body: 46df3d70b5SDavid Sherwood %index = phi i8 [ %index.next, %for.inc ], [ 0, %entry ] 47df3d70b5SDavid Sherwood %index.next = add i8 %index, 1 48df3d70b5SDavid Sherwood %conv = zext i8 %index.next to i32 49df3d70b5SDavid Sherwood %cmp.body = icmp ne i32 %conv, 1024 50df3d70b5SDavid Sherwood br i1 %cmp.body, label %for.work, label %exit 51df3d70b5SDavid Sherwood 52df3d70b5SDavid Sherwoodfor.work: 53df3d70b5SDavid Sherwood %arrayidx = getelementptr inbounds i32, ptr %src1, i8 %index 54df3d70b5SDavid Sherwood %0 = load i32, ptr %arrayidx, align 4 55df3d70b5SDavid Sherwood %arrayidx3 = getelementptr inbounds i32, ptr %src2, i8 %index 56df3d70b5SDavid Sherwood %1 = load i32, ptr %arrayidx3, align 4 57df3d70b5SDavid Sherwood %cmp.work = icmp eq i32 %0, %1 58df3d70b5SDavid Sherwood br i1 %cmp.work, label %found, label %for.inc 59df3d70b5SDavid Sherwood 60df3d70b5SDavid Sherwoodfor.inc: 61df3d70b5SDavid Sherwood %cmp.inc = icmp ult i32 %conv, %end 62df3d70b5SDavid Sherwood br i1 %cmp.inc, label %for.body, label %exit 63df3d70b5SDavid Sherwood 64df3d70b5SDavid Sherwoodfound: 65df3d70b5SDavid Sherwood ret i32 1 66df3d70b5SDavid Sherwood 67df3d70b5SDavid Sherwoodexit: 68df3d70b5SDavid Sherwood ret i32 0 69df3d70b5SDavid Sherwood} 70