[flang-commits] [flang] 78c40b3 - [flang] Control flow with empty select case blocks

V Donaldson via flang-commits flang-commits at lists.llvm.org
Thu Sep 8 10:07:35 PDT 2022


Author: V Donaldson
Date: 2022-09-08T10:07:07-07:00
New Revision: 78c40b3c53ccfa272528d7d4f03d5f25d0b7806e

URL: https://github.com/llvm/llvm-project/commit/78c40b3c53ccfa272528d7d4f03d5f25d0b7806e
DIFF: https://github.com/llvm/llvm-project/commit/78c40b3c53ccfa272528d7d4f03d5f25d0b7806e.diff

LOG: [flang] Control flow with empty select case blocks

Fix control flow for empty select case blocks such as:

  select case (2)
    case (1)
      print*, '1'
    case (2)
    ! print*, '2'
    case default
      print*, 'default'
  end select

Added: 
    

Modified: 
    flang/lib/Lower/Bridge.cpp
    flang/test/Lower/select-case-statement.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 114ef4e37c25f..a8f020ab04f70 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -2680,6 +2680,10 @@ class FirConverter : public Fortran::lower::AbstractConverter {
                eval.getLastNestedEvaluation()
                    .lexicalSuccessor->isIntermediateConstructStmt())
         successor = eval.constructExit;
+      else if (eval.isConstructStmt() &&
+               eval.lexicalSuccessor == eval.controlSuccessor)
+        // empty construct block
+        successor = eval.parentConstruct->constructExit;
       if (successor && successor->block)
         genFIRBranch(successor->block);
     }

diff  --git a/flang/test/Lower/select-case-statement.f90 b/flang/test/Lower/select-case-statement.f90
index 0a666b940893a..5eaff33dc89d0 100644
--- a/flang/test/Lower/select-case-statement.f90
+++ b/flang/test/Lower/select-case-statement.f90
@@ -285,6 +285,59 @@ subroutine scharacter2(s)
     print*, n
   end subroutine
 
+  ! CHECK-LABEL: func @_QPsempty
+  ! empty select case blocks
+  subroutine sempty(n)
+    ! CHECK:   %[[selectI1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
+    ! CHECK:   fir.select_case %[[selectI1]] : i32 [#fir.point, %c1{{.*}}, ^bb1, #fir.point, %c2{{.*}}, ^bb2, unit, ^bb3]
+    ! CHECK: ^bb1:  // pred: ^bb0
+    ! CHECK:   fir.call @_FortranAioBeginExternalListOutput
+    ! CHECK:   br ^bb4
+    ! CHECK: ^bb2:  // pred: ^bb0
+    ! CHECK:   br ^bb4
+    ! CHECK: ^bb3:  // pred: ^bb0
+    ! CHECK:   fir.call @_FortranAioBeginExternalListOutput
+    ! CHECK:   br ^bb4
+    select case (n)
+      case (1)
+        print*, n, 'i:case 1'
+      case (2)
+      ! print*, n, 'i:case 2'
+      case default
+        print*, n, 'i:case default'
+    end select
+    ! CHECK: ^bb4:  // 3 preds: ^bb1, ^bb2, ^bb3
+    ! CHECK:   %[[cmpC1:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
+    ! CHECK:   %[[selectC1:[0-9]+]] = arith.cmpi eq, %[[cmpC1]], %c0{{.*}} : i32
+    ! CHECK:   cond_br %[[selectC1]], ^bb6, ^bb5
+    ! CHECK: ^bb5:  // pred: ^bb4
+    ! CHECK:   %[[cmpC2:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
+    ! CHECK:   %[[selectC2:[0-9]+]] = arith.cmpi eq, %[[cmpC2]], %c0{{.*}} : i32
+    ! CHECK:   cond_br %[[selectC2]], ^bb8, ^bb7
+    ! CHECK: ^bb6:  // pred: ^bb4
+    ! CHECK:   fir.call @_FortranAioBeginExternalListOutput
+    ! print*, n, 'c:case 2'
+    ! CHECK:   br ^bb10
+    ! CHECK: ^bb7:  // pred: ^bb5
+    ! CHECK:   br ^bb9
+    ! CHECK: ^bb8:  // pred: ^bb5
+    ! CHECK:   br ^bb10
+    ! CHECK: ^bb9:  // pred: ^bb7
+    ! CHECK:   fir.call @_FortranAioBeginExternalListOutput
+    ! CHECK:   br ^bb10
+    ! CHECK: ^bb10:  // 3 preds: ^bb6, ^bb8, ^bb9
+    select case (char(ichar('0')+n))
+      case ('1')
+        print*, n, 'c:case 1'
+      case ('2')
+      ! print*, n, 'c:case 2'
+      case default
+        print*, n, 'c:case default'
+    end select
+    ! CHECK:   return
+  end subroutine
+
+
   ! CHECK-LABEL: func @_QPswhere
   subroutine swhere(num)
     implicit none
@@ -393,6 +446,12 @@ program p
     call scharacter2('.  ')   ! expected output:  9 -2
     call scharacter2('   ')   ! expected output:  9 -2
 
+    print*
+    call sempty(0)            ! expected output: 0 i:case default 0; c:case default
+    call sempty(1)            ! expected output: 1 i:case 1; 1 c:case 1
+    call sempty(2)            ! no output
+    call sempty(3)            ! expected output: 3 i:case default; 3 c:case default
+
     print*
     call swhere(1)            ! expected output: 42.
     call sforall(1)           ! expected output: 42.


        


More information about the flang-commits mailing list