1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes 2; RUN: opt < %s -passes=loop-deletion -verify-dom-info -S | FileCheck %s 3 4;; Original C Code: 5;; void unknown_tripcount_mustprogress_attr_mustprogress_loopmd(int a, int b) { 6;; for (; a < b;) ; 7;; for (;;) ; 8;; } 9 10define void @unknown_tripcount_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) #0 { 11; CHECK: Function Attrs: mustprogress 12; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_mustprogress_loopmd 13; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0:#.*]] { 14; CHECK-NEXT: entry: 15; CHECK-NEXT: br label [[FOR_END:%.*]] 16; CHECK: for.end: 17; CHECK-NEXT: unreachable 18; 19entry: 20 br label %for.cond 21for.cond: 22 %cmp = icmp slt i32 %a, %b 23 br i1 %cmp, label %for.body, label %for.end 24for.body: 25 br label %for.cond, !llvm.loop !2 26for.end: 27 br label %for.cond1 28for.cond1: 29 br label %for.cond1 30} 31 32;; Original C Code: 33;; void unknown_tripcount_mustprogress_attr_no_mustprogress_loopmd(int a, int b) { 34;; for (; a < b;) ; 35;; for (;;) ; 36;; } 37;; => Removed mustprogress loop attribute 38 39define void @unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd(i32 %a, i32 %b) #0 { 40; CHECK: Function Attrs: mustprogress 41; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd 42; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0]] { 43; CHECK-NEXT: entry: 44; CHECK-NEXT: br label [[FOR_END:%.*]] 45; CHECK: for.end: 46; CHECK-NEXT: unreachable 47; 48entry: 49 br label %for.cond 50for.cond: 51 %cmp = icmp slt i32 %a, %b 52 br i1 %cmp, label %for.body, label %for.end 53for.body: 54 br label %for.cond 55for.end: 56 br label %for.cond1 57for.cond1: 58 br label %for.cond1 59} 60 61;; Original C Code: 62;; void known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { 63;; for (int i = 0; i < 5; i++) ; 64;; } 65 66define void @known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { 67; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() { 68; CHECK-NEXT: entry: 69; CHECK-NEXT: br label [[FOR_END:%.*]] 70; CHECK: for.end: 71; CHECK-NEXT: ret void 72; 73entry: 74 br label %for.cond 75for.cond: 76 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] 77 %cmp = icmp slt i32 %i.0, 5 78 br i1 %cmp, label %for.body, label %for.end 79for.body: 80 br label %for.inc 81for.inc: 82 %inc = add nsw i32 %i.0, 1 83 br label %for.cond 84for.end: 85 ret void 86} 87 88;; Original C Code: 89;; void known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { 90;; for (int i = 0; i < 5; i++) ; 91;; } 92;; => Added mustprogress loop attribute 93 94define void @known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { 95; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_mustprogress_loopmd() { 96; CHECK-NEXT: entry: 97; CHECK-NEXT: br label [[FOR_END:%.*]] 98; CHECK: for.end: 99; CHECK-NEXT: ret void 100; 101entry: 102 br label %for.cond 103for.cond: 104 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] 105 %cmp = icmp slt i32 %i.0, 5 106 br i1 %cmp, label %for.body, label %for.end 107for.body: 108 br label %for.inc 109for.inc: 110 %inc = add nsw i32 %i.0, 1 111 br label %for.cond, !llvm.loop !4 112for.end: 113 ret void 114} 115 116;; Original C Code: 117;; void known_tripcount_mustprogress_attr_no_mustprogress_loopmd() { 118;; for (int i = 0; i < 5; i++) ; 119;; } 120;; => Added mustprogress function attribute 121 122define void @known_tripcount_mustprogress_attr_no_mustprogress_loopmd() #0 { 123; CHECK: Function Attrs: mustprogress 124; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_no_mustprogress_loopmd 125; CHECK-SAME: () [[ATTR0]] { 126; CHECK-NEXT: entry: 127; CHECK-NEXT: br label [[FOR_END:%.*]] 128; CHECK: for.end: 129; CHECK-NEXT: ret void 130; 131entry: 132 br label %for.cond 133for.cond: 134 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] 135 %cmp = icmp slt i32 %i.0, 5 136 br i1 %cmp, label %for.body, label %for.end 137for.body: 138 br label %for.inc 139for.inc: 140 %inc = add nsw i32 %i.0, 1 141 br label %for.cond 142for.end: 143 ret void 144} 145 146;; Original C Code: 147;; void known_tripcount_mustprogress_attr_mustprogress_loopmd() { 148;; for (int i = 0; i < 5; i++) ; 149;; } 150;; => Added mustprogress function and mustprogress loop attribute 151 152define void @known_tripcount_mustprogress_attr_mustprogress_loopmd() #0 { 153; CHECK: Function Attrs: mustprogress 154; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_mustprogress_loopmd 155; CHECK-SAME: () [[ATTR0]] { 156; CHECK-NEXT: entry: 157; CHECK-NEXT: br label [[FOR_END:%.*]] 158; CHECK: for.end: 159; CHECK-NEXT: ret void 160; 161entry: 162 br label %for.cond 163for.cond: 164 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] 165 %cmp = icmp slt i32 %i.0, 5 166 br i1 %cmp, label %for.body, label %for.end 167for.body: 168 br label %for.inc 169for.inc: 170 %inc = add nsw i32 %i.0, 1 171 br label %for.cond, !llvm.loop !5 172for.end: 173 ret void 174} 175 176;; Original C Code: 177;; void unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(int a, int b) { 178;; for (; a < b;) ; 179;; } 180;; => Added mustprogress loop attribute 181 182define void @unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) { 183; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd 184; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 185; CHECK-NEXT: entry: 186; CHECK-NEXT: br label [[FOR_END:%.*]] 187; CHECK: for.end: 188; CHECK-NEXT: ret void 189; 190entry: 191 br label %for.cond 192for.cond: 193 %cmp = icmp slt i32 %a, %b 194 br i1 %cmp, label %for.body, label %for.end 195for.body: 196 br label %for.cond, !llvm.loop !6 197for.end: 198 ret void 199} 200 201;; Original C Code: 202;; void unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(int a, int b) { 203;; for (; a < b;) ; 204;; } 205 206define void @unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(i32 %a, i32 %b) { 207; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd 208; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 209; CHECK-NEXT: entry: 210; CHECK-NEXT: br label [[FOR_COND:%.*]] 211; CHECK: for.cond: 212; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 213; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 214; CHECK: for.body: 215; CHECK-NEXT: br label [[FOR_COND]] 216; CHECK: for.end: 217; CHECK-NEXT: ret void 218; 219entry: 220 br label %for.cond 221for.cond: 222 %cmp = icmp slt i32 %a, %b 223 br i1 %cmp, label %for.body, label %for.end 224for.body: 225 br label %for.cond 226for.end: 227 ret void 228} 229 230; CHECK: attributes [[ATTR0]] = { mustprogress } 231 232attributes #0 = { mustprogress } 233!2 = distinct !{!2, !3} 234!3 = !{!"llvm.loop.mustprogress"} 235!4 = distinct !{!4, !3} 236!5 = distinct !{!5, !3} 237!6 = distinct !{!6, !3} 238