@@ -490,3 +490,139 @@ func.func @branchCondProp(%arg0: i1) {
490490^exit :
491491 return
492492}
493+
494+ // -----
495+
496+ /// Test that control-flow cycles are not simplified infinitely.
497+
498+ // CHECK-LABEL: @cycle_2_blocks
499+ // CHECK: cf.br ^bb1
500+ // CHECK: ^bb1:
501+ // CHECK: cf.br ^bb1
502+ func.func @cycle_2_blocks () {
503+ cf.br ^bb1
504+ ^bb1 :
505+ cf.br ^bb2
506+ ^bb2 :
507+ cf.br ^bb1
508+ }
509+
510+ // CHECK-LABEL: @no_cycle_2_blocks
511+ // CHECK: %[[VAL_0:.*]] = arith.constant 1 : i32
512+ // CHECK: return %[[VAL_0]] : i32
513+ func.func @no_cycle_2_blocks () -> i32 {
514+ cf.br ^bb1
515+ ^bb1 :
516+ cf.br ^bb2
517+ ^bb2 :
518+ cf.br ^bb3
519+ ^bb3 :
520+ %ret = arith.constant 1 : i32
521+ return %ret : i32
522+ }
523+
524+ // CHECK-LABEL: @cycle_4_blocks
525+ // CHECK: cf.br ^bb1
526+ // CHECK: ^bb1:
527+ // CHECK: cf.br ^bb1
528+ func.func @cycle_4_blocks () {
529+ cf.br ^bb1
530+ ^bb1 :
531+ cf.br ^bb2
532+ ^bb2 :
533+ cf.br ^bb3
534+ ^bb3 :
535+ cf.br ^bb4
536+ ^bb4 :
537+ cf.br ^bb1
538+ }
539+
540+ // CHECK-LABEL: @no_cycle_4_blocks
541+ // CHECK: %[[VAL_0:.*]] = arith.constant 1 : i32
542+ // CHECK: return %[[VAL_0]] : i32
543+ func.func @no_cycle_4_blocks () -> i32 {
544+ cf.br ^bb1
545+ ^bb1 :
546+ cf.br ^bb2
547+ ^bb2 :
548+ cf.br ^bb3
549+ ^bb3 :
550+ cf.br ^bb4
551+ ^bb4 :
552+ cf.br ^bb5
553+ ^bb5 :
554+ %ret = arith.constant 1 : i32
555+ return %ret : i32
556+ }
557+
558+ // CHECK-LABEL: @delayed_3_cycle
559+ // CHECK: cf.br ^bb1
560+ // CHECK: ^bb1:
561+ // CHECK: cf.br ^bb1
562+ func.func @delayed_3_cycle () {
563+ cf.br ^bb1
564+ ^bb1 :
565+ cf.br ^bb2
566+ ^bb2 :
567+ cf.br ^bb3
568+ ^bb3 :
569+ cf.br ^bb4
570+ ^bb4 :
571+ cf.br ^bb5
572+ ^bb5 :
573+ cf.br ^bb3
574+ }
575+
576+ // CHECK-LABEL: @cycle_1_block
577+ // CHECK: cf.br ^bb1
578+ // CHECK: ^bb1:
579+ // CHECK: cf.br ^bb1
580+ func.func @cycle_1_block () {
581+ cf.br ^bb1
582+ ^bb1 :
583+ cf.br ^bb2
584+ ^bb2 :
585+ cf.br ^bb2
586+ }
587+
588+ // CHECK-LABEL: @unsimplified_cycle_1
589+ // CHECK-SAME: %[[ARG0:.*]]: i1) {
590+ // CHECK: cf.br ^bb1
591+ // CHECK: ^bb1:
592+ // CHECK: cf.br ^bb1
593+ func.func @unsimplified_cycle_1 (%c : i1 ) {
594+ cf.cond_br %c , ^bb1 , ^bb2
595+ ^bb1 :
596+ cf.br ^bb2
597+ ^bb2 :
598+ cf.br ^bb3
599+ ^bb3 :
600+ cf.br ^bb4
601+ ^bb4 :
602+ cf.br ^bb3
603+ }
604+
605+ // Make sure we terminate when other cf passes can't help us.
606+
607+ // CHECK-LABEL: @unsimplified_cycle_2
608+ // CHECK-SAME: %[[ARG0:.*]]: i1) {
609+ // CHECK: cf.br ^bb1
610+ // CHECK: ^bb1:
611+ // CHECK: cf.br ^bb1 {E}
612+ func.func @unsimplified_cycle_2 (%c : i1 ) {
613+ cf.cond_br %c , ^bb6 , ^bb7
614+ ^bb6 :
615+ cf.br ^bb5 {F }
616+ ^bb5 :
617+ cf.br ^bb1 {A }
618+ ^bb1 :
619+ cf.br ^bb2 {B }
620+ ^bb2 :
621+ cf.br ^bb3 {C }
622+ ^bb3 :
623+ cf.br ^bb4 {D }
624+ ^bb4 :
625+ cf.br ^bb1 {E }
626+ ^bb7 :
627+ cf.br ^bb6
628+ }
0 commit comments