diff --git a/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp b/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp index b09bbf6106db..8a9e9b80134b 100644 --- a/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp +++ b/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp @@ -123,23 +123,24 @@ public: : terminator->operand_begin(); loopCarried.append(begin, terminator->operand_end()); loopCarried.push_back(itersMinusOne); - rewriter.create(loc, conditionalBlock, loopCarried); + auto backEdge = + rewriter.create(loc, conditionalBlock, loopCarried); rewriter.eraseOp(terminator); + // Copy loop annotations from the do loop to the loop back edge. + if (auto ann = loop.getLoopAnnotation()) + backEdge->setAttr("loop_annotation", *ann); + // Conditional block rewriter.setInsertionPointToEnd(conditionalBlock); auto zero = rewriter.create(loc, 0); auto comparison = rewriter.create( loc, arith::CmpIPredicate::sgt, itersLeft, zero); - auto cond = rewriter.create( + rewriter.create( loc, comparison, firstBlock, llvm::ArrayRef(), endBlock, llvm::ArrayRef()); - // Copy loop annotations from the do loop to the loop entry condition. - if (auto ann = loop.getLoopAnnotation()) - cond->setAttr("loop_annotation", *ann); - // The result of the loop operation is the values of the condition block // arguments except the induction variable on the last iteration. auto args = loop.getFinalValue() diff --git a/flang/test/Fir/vector-always.fir b/flang/test/Fir/vector-always.fir index 00eb0e7a756e..ec06b94a3d0f 100644 --- a/flang/test/Fir/vector-always.fir +++ b/flang/test/Fir/vector-always.fir @@ -13,7 +13,9 @@ func.func @_QPvector_always() -> i32 { %c10_i32 = arith.constant 10 : i32 %c1_i32 = arith.constant 1 : i32 %c10 = arith.constant 10 : index -// CHECK: cf.cond_br %{{.*}}, ^{{.*}}, ^{{.*}} {loop_annotation = #[[ANNOTATION]]} +// CHECK: cf.cond_br +// CHECK-NOT: loop_annotation +// CHECK: cf.br ^{{.*}} {loop_annotation = #[[ANNOTATION]]} %8:2 = fir.do_loop %arg0 = %c1 to %c10 step %c1 iter_args(%arg1 = %c1_i32) -> (index, i32) attributes {loopAnnotation = #loop_annotation} { fir.result %c1, %c1_i32 : index, i32 } diff --git a/flang/test/Integration/unroll.f90 b/flang/test/Integration/unroll.f90 index aa47e465b63f..f2c2ecb5cffa 100644 --- a/flang/test/Integration/unroll.f90 +++ b/flang/test/Integration/unroll.f90 @@ -3,8 +3,10 @@ ! CHECK-LABEL: unroll_dir subroutine unroll_dir integer :: a(10) - !dir$ unroll - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[UNROLL_ENABLE_FULL_ANNO:.*]] + !dir$ unroll + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[UNROLL_ENABLE_FULL_ANNO:.*]] do i=1,10 a(i)=i end do @@ -14,7 +16,9 @@ end subroutine unroll_dir subroutine unroll_dir_0 integer :: a(10) !dir$ unroll 0 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[UNROLL_DISABLE_ANNO:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[UNROLL_DISABLE_ANNO:.*]] do i=1,10 a(i)=i end do @@ -24,7 +28,9 @@ end subroutine unroll_dir_0 subroutine unroll_dir_1 integer :: a(10) !dir$ unroll 1 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[UNROLL_DISABLE_ANNO]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[UNROLL_DISABLE_ANNO]] do i=1,10 a(i)=i end do @@ -34,7 +40,9 @@ end subroutine unroll_dir_1 subroutine unroll_dir_2 integer :: a(10) !dir$ unroll 2 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[UNROLL_ENABLE_COUNT_2:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[UNROLL_ENABLE_COUNT_2:.*]] do i=1,10 a(i)=i end do diff --git a/flang/test/Integration/unroll_and_jam.f90 b/flang/test/Integration/unroll_and_jam.f90 index b9c16d34ac90..05b3aaa04a1e 100644 --- a/flang/test/Integration/unroll_and_jam.f90 +++ b/flang/test/Integration/unroll_and_jam.f90 @@ -4,7 +4,9 @@ subroutine unroll_and_jam_dir integer :: a(10) !dir$ unroll_and_jam 4 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION:.*]] do i=1,10 a(i)=i end do @@ -14,7 +16,9 @@ end subroutine unroll_and_jam_dir subroutine unroll_and_jam_dir_0 integer :: a(10) !dir$ unroll_and_jam 0 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE:.*]] do i=1,10 a(i)=i end do @@ -24,7 +28,9 @@ end subroutine unroll_and_jam_dir_0 subroutine unroll_and_jam_dir_1 integer :: a(10) !dir$ unroll_and_jam 1 - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE]] do i=1,10 a(i)=i end do @@ -34,7 +40,9 @@ end subroutine unroll_and_jam_dir_1 subroutine nounroll_and_jam_dir integer :: a(10) !dir$ nounroll_and_jam - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION_DISABLE]] do i=1,10 a(i)=i end do @@ -44,7 +52,9 @@ end subroutine nounroll_and_jam_dir subroutine unroll_and_jam_dir_no_factor integer :: a(10) !dir$ unroll_and_jam - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION_NO_FACTOR:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION_NO_FACTOR:.*]] do i=1,10 a(i)=i end do diff --git a/flang/test/Integration/vector-always.f90 b/flang/test/Integration/vector-always.f90 index ee2aa8ab485e..1d8aad97bde7 100644 --- a/flang/test/Integration/vector-always.f90 +++ b/flang/test/Integration/vector-always.f90 @@ -4,7 +4,9 @@ subroutine vector_always integer :: a(10) !dir$ vector always - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION:.*]] do i=1,10 a(i)=i end do @@ -14,7 +16,9 @@ end subroutine vector_always subroutine no_vector integer :: a(10) !dir$ novector - ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[ANNOTATION2:.*]] + ! CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}} + ! CHECK-NOT: !llvm.loop + ! CHECK: br label {{.*}}, !llvm.loop ![[ANNOTATION2:.*]] do i=1,10 a(i)=i end do