| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes |
| ; RUN: opt < %s -passes=loop-deletion -verify-dom-info -S | FileCheck %s |
| |
| ;; Original C Code: |
| ;; void unknown_tripcount_mustprogress_attr_mustprogress_loopmd(int a, int b) { |
| ;; for (; a < b;) ; |
| ;; for (;;) ; |
| ;; } |
| |
| define void @unknown_tripcount_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) #0 { |
| ; CHECK: Function Attrs: mustprogress |
| ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_mustprogress_loopmd |
| ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0:#.*]] { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %cmp = icmp slt i32 %a, %b |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.cond, !llvm.loop !2 |
| for.end: |
| br label %for.cond1 |
| for.cond1: |
| br label %for.cond1 |
| } |
| |
| ;; Original C Code: |
| ;; void unknown_tripcount_mustprogress_attr_no_mustprogress_loopmd(int a, int b) { |
| ;; for (; a < b;) ; |
| ;; for (;;) ; |
| ;; } |
| ;; => Removed mustprogress loop attribute |
| |
| define void @unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd(i32 %a, i32 %b) #0 { |
| ; CHECK: Function Attrs: mustprogress |
| ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd |
| ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0]] { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %cmp = icmp slt i32 %a, %b |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.cond |
| for.end: |
| br label %for.cond1 |
| for.cond1: |
| br label %for.cond1 |
| } |
| |
| ;; Original C Code: |
| ;; void known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { |
| ;; for (int i = 0; i < 5; i++) ; |
| ;; } |
| |
| define void @known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { |
| ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] |
| %cmp = icmp slt i32 %i.0, 5 |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.inc |
| for.inc: |
| %inc = add nsw i32 %i.0, 1 |
| br label %for.cond |
| for.end: |
| ret void |
| } |
| |
| ;; Original C Code: |
| ;; void known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { |
| ;; for (int i = 0; i < 5; i++) ; |
| ;; } |
| ;; => Added mustprogress loop attribute |
| |
| define void @known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { |
| ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] |
| %cmp = icmp slt i32 %i.0, 5 |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.inc |
| for.inc: |
| %inc = add nsw i32 %i.0, 1 |
| br label %for.cond, !llvm.loop !4 |
| for.end: |
| ret void |
| } |
| |
| ;; Original C Code: |
| ;; void known_tripcount_mustprogress_attr_no_mustprogress_loopmd() { |
| ;; for (int i = 0; i < 5; i++) ; |
| ;; } |
| ;; => Added mustprogress function attribute |
| |
| define void @known_tripcount_mustprogress_attr_no_mustprogress_loopmd() #0 { |
| ; CHECK: Function Attrs: mustprogress |
| ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_no_mustprogress_loopmd |
| ; CHECK-SAME: () [[ATTR0]] { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] |
| %cmp = icmp slt i32 %i.0, 5 |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.inc |
| for.inc: |
| %inc = add nsw i32 %i.0, 1 |
| br label %for.cond |
| for.end: |
| ret void |
| } |
| |
| ;; Original C Code: |
| ;; void known_tripcount_mustprogress_attr_mustprogress_loopmd() { |
| ;; for (int i = 0; i < 5; i++) ; |
| ;; } |
| ;; => Added mustprogress function and mustprogress loop attribute |
| |
| define void @known_tripcount_mustprogress_attr_mustprogress_loopmd() #0 { |
| ; CHECK: Function Attrs: mustprogress |
| ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_mustprogress_loopmd |
| ; CHECK-SAME: () [[ATTR0]] { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] |
| %cmp = icmp slt i32 %i.0, 5 |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.inc |
| for.inc: |
| %inc = add nsw i32 %i.0, 1 |
| br label %for.cond, !llvm.loop !5 |
| for.end: |
| ret void |
| } |
| |
| ;; Original C Code: |
| ;; void unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(int a, int b) { |
| ;; for (; a < b;) ; |
| ;; } |
| ;; => Added mustprogress loop attribute |
| |
| define void @unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) { |
| ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd |
| ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %cmp = icmp slt i32 %a, %b |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.cond, !llvm.loop !6 |
| for.end: |
| ret void |
| } |
| |
| ;; Original C Code: |
| ;; void unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(int a, int b) { |
| ;; for (; a < b;) ; |
| ;; } |
| |
| define void @unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(i32 %a, i32 %b) { |
| ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd |
| ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[FOR_COND:%.*]] |
| ; CHECK: for.cond: |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] |
| ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] |
| ; CHECK: for.body: |
| ; CHECK-NEXT: br label [[FOR_COND]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %for.cond |
| for.cond: |
| %cmp = icmp slt i32 %a, %b |
| br i1 %cmp, label %for.body, label %for.end |
| for.body: |
| br label %for.cond |
| for.end: |
| ret void |
| } |
| |
| ; CHECK: attributes [[ATTR0]] = { mustprogress } |
| |
| attributes #0 = { mustprogress } |
| !2 = distinct !{!2, !3} |
| !3 = !{!"llvm.loop.mustprogress"} |
| !4 = distinct !{!4, !3} |
| !5 = distinct !{!5, !3} |
| !6 = distinct !{!6, !3} |