@@ -491,3 +491,61 @@ module @test_multiple_args_dynamic {
491491// CHECK-NEXT: return %[[FOR]]#0, %[[FOR]]#1 : index, index
492492// CHECK-NEXT: }
493493// CHECK-NEXT: }
494+
495+ //----
496+
497+ // Loop condition is an and expression
498+ module @test_and_condition {
499+ func.func @do_while (%ub : i32 ) -> (i32 , f32 ) {
500+ %cst = arith.constant 0.000000e+00 : f32
501+ %cst1 = arith.constant 1.000000e+00 : f32
502+ %c0_i32 = arith.constant 0 : i32
503+ %c1_i32 = arith.constant 1 : i32
504+ %true = arith.constant true
505+ %2:3 = scf.while (%arg10 = %c0_i32 , %arg12 = %cst , %ac = %true ) : (i32 , f32 , i1 ) -> (i32 , f32 , i1 ) {
506+ %3 = arith.cmpi ult , %arg10 , %ub : i32
507+ %a = arith.andi %3 , %ac : i1
508+ %p = arith.addi %arg10 , %c1_i32 : i32
509+ %c = " test.something" () : () -> (i1 )
510+ %4 = arith.addf %arg12 , %cst1 : f32
511+ scf.condition (%a ) %p , %4 , %c : i32 , f32 , i1
512+ } do {
513+ ^bb0 (%arg10: i32 , %arg12: f32 , %ac: i1 ):
514+ scf.yield %arg10 , %arg12 , %ac : i32 , f32 , i1
515+ }
516+ return %2#0 , %2#1 : i32 , f32
517+ }
518+ }
519+
520+ // CHECK-LABEL: module @test_and_condition {
521+ // CHECK: func.func @do_while(%[[UB:.+]]: i32) -> (i32, f32) {
522+ // CHECK-DAG: %[[C0:.+]] = arith.constant 0 : i32
523+ // CHECK-DAG: %[[C1:.+]] = arith.constant 1 : i32
524+ // CHECK-DAG: %[[FALSE:.+]] = arith.constant false
525+ // CHECK-DAG: %[[TRUE:.+]] = arith.constant true
526+ // CHECK-DAG: %[[CST0:.+]] = arith.constant 0.000000e+00 : f32
527+ // CHECK-DAG: %[[CST1:.+]] = arith.constant 1.000000e+00 : f32
528+ // CHECK-DAG: %[[UNDEF_I32:.+]] = ub.poison : i32
529+ // CHECK-DAG: %[[UNDEF_F32:.+]] = ub.poison : f32
530+ // CHECK-DAG: %[[UNDEF_I1:.+]] = ub.poison : i1
531+ // CHECK-NEXT: %[[MAX:.+]] = arith.maxsi %[[UB]], %[[C0]] : i32
532+ // CHECK-NEXT: %[[ADJ_UB:.+]] = arith.addi %[[MAX]], %[[C1]] : i32
533+ // CHECK-NEXT: %[[FOR:.+]]:7 = scf.for %[[IV:.+]] = %[[C0]] to %[[ADJ_UB]] step %[[C1]] iter_args(%[[ARG0:.+]] = %[[C0]], %[[ARG1:.+]] = %[[CST0]], %[[ARG2:.+]] = %[[TRUE]], %[[ARG3:.+]] = %[[UNDEF_I32]], %[[ARG4:.+]] = %[[UNDEF_F32]], %[[ARG5:.+]] = %[[UNDEF_I1]], %[[ARG6:.+]] = %[[TRUE]]) -> (i32, f32, i1, i32, f32, i1, i1) : i32 {
534+ // CHECK-NEXT: %[[IF1:.+]]:4 = scf.if %[[ARG6]] -> (i32, f32, i1, i1) {
535+ // CHECK-NEXT: %[[ADDI:.+]] = arith.addi %[[ARG0]], %[[C1]] : i32
536+ // CHECK-NEXT: %[[VAL:.+]] = "test.something"() : () -> i1
537+ // CHECK-NEXT: %[[ADDF:.+]] = arith.addf %[[ARG1]], %[[CST1]] : f32
538+ // CHECK-NEXT: scf.yield %[[ADDI]], %[[ADDF]], %[[VAL]], %[[ARG2]] : i32, f32, i1, i1
539+ // CHECK-NEXT: } else {
540+ // CHECK-NEXT: scf.yield %[[ARG3]], %[[ARG4]], %[[ARG5]], %[[FALSE]] : i32, f32, i1, i1
541+ // CHECK-NEXT: }
542+ // CHECK-NEXT: %[[CMP:.+]] = arith.cmpi slt, %[[IV]], %[[UB]] : i32
543+ // CHECK-NEXT: %[[COND:.+]] = arith.andi %[[CMP]], %[[IF1]]#3 : i1
544+ // CHECK-NEXT: %[[IF2:.+]]:3 = scf.if %[[COND]] -> (i32, f32, i1) {
545+ // CHECK-NEXT: scf.yield %[[IF1]]#0, %[[IF1]]#1, %[[IF1]]#2 : i32, f32, i1
546+ // CHECK-NEXT: } else {
547+ // CHECK-NEXT: scf.yield %[[UNDEF_I32]], %[[UNDEF_F32]], %[[UNDEF_I1]] : i32, f32, i1
548+ // CHECK-NEXT: }
549+ // CHECK-NEXT: scf.yield %[[IF2]]#0, %[[IF2]]#1, %[[IF2]]#2, %[[IF1]]#0, %[[IF1]]#1, %[[IF1]]#2, %[[IF1]]#3 : i32, f32, i1, i32, f32, i1, i1
550+ // CHECK-NEXT: }
551+ // CHECK-NEXT: return %[[FOR]]#3, %[[FOR]]#4 : i32, f32
0 commit comments