238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes2; RUN: opt < %s -passes=loop-deletion -verify-dom-info -S | FileCheck %s3 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: mustprogress12; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_mustprogress_loopmd13; 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: unreachable18;19entry:20 br label %for.cond21for.cond:22 %cmp = icmp slt i32 %a, %b23 br i1 %cmp, label %for.body, label %for.end24for.body:25 br label %for.cond, !llvm.loop !226for.end:27 br label %for.cond128for.cond1:29 br label %for.cond130}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 attribute38 39define void @unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd(i32 %a, i32 %b) #0 {40; CHECK: Function Attrs: mustprogress41; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd42; 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: unreachable47;48entry:49 br label %for.cond50for.cond:51 %cmp = icmp slt i32 %a, %b52 br i1 %cmp, label %for.body, label %for.end53for.body:54 br label %for.cond55for.end:56 br label %for.cond157for.cond1:58 br label %for.cond159}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 void72;73entry:74 br label %for.cond75for.cond:76 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]77 %cmp = icmp slt i32 %i.0, 578 br i1 %cmp, label %for.body, label %for.end79for.body:80 br label %for.inc81for.inc:82 %inc = add nsw i32 %i.0, 183 br label %for.cond84for.end:85 ret void86}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 attribute93 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 void100;101entry:102 br label %for.cond103for.cond:104 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]105 %cmp = icmp slt i32 %i.0, 5106 br i1 %cmp, label %for.body, label %for.end107for.body:108 br label %for.inc109for.inc:110 %inc = add nsw i32 %i.0, 1111 br label %for.cond, !llvm.loop !4112for.end:113 ret void114}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 attribute121 122define void @known_tripcount_mustprogress_attr_no_mustprogress_loopmd() #0 {123; CHECK: Function Attrs: mustprogress124; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_no_mustprogress_loopmd125; CHECK-SAME: () [[ATTR0]] {126; CHECK-NEXT: entry:127; CHECK-NEXT: br label [[FOR_END:%.*]]128; CHECK: for.end:129; CHECK-NEXT: ret void130;131entry:132 br label %for.cond133for.cond:134 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]135 %cmp = icmp slt i32 %i.0, 5136 br i1 %cmp, label %for.body, label %for.end137for.body:138 br label %for.inc139for.inc:140 %inc = add nsw i32 %i.0, 1141 br label %for.cond142for.end:143 ret void144}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 attribute151 152define void @known_tripcount_mustprogress_attr_mustprogress_loopmd() #0 {153; CHECK: Function Attrs: mustprogress154; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_mustprogress_loopmd155; CHECK-SAME: () [[ATTR0]] {156; CHECK-NEXT: entry:157; CHECK-NEXT: br label [[FOR_END:%.*]]158; CHECK: for.end:159; CHECK-NEXT: ret void160;161entry:162 br label %for.cond163for.cond:164 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]165 %cmp = icmp slt i32 %i.0, 5166 br i1 %cmp, label %for.body, label %for.end167for.body:168 br label %for.inc169for.inc:170 %inc = add nsw i32 %i.0, 1171 br label %for.cond, !llvm.loop !5172for.end:173 ret void174}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 attribute181 182define void @unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) {183; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd184; 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 void189;190entry:191 br label %for.cond192for.cond:193 %cmp = icmp slt i32 %a, %b194 br i1 %cmp, label %for.body, label %for.end195for.body:196 br label %for.cond, !llvm.loop !6197for.end:198 ret void199}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_loopmd208; 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 void218;219entry:220 br label %for.cond221for.cond:222 %cmp = icmp slt i32 %a, %b223 br i1 %cmp, label %for.body, label %for.end224for.body:225 br label %for.cond226for.end:227 ret void228}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