llvm-project/flang/test/Fir/vector-always-cfg.fir
David Truby c6b6e18c4d
[flang] Implement !DIR$ VECTOR ALWAYS (#93830)
This patch implements support for the VECTOR ALWAYS directive, which
forces
vectorization to occurr when possible regardless of a decision by the
cost
model. This is done by adding an attribute to the branch into the loop
in LLVM
to indicate that the loop should always be vectorized.

This patch only implements this directive on plan structured do loops 
without labels. Support for unstructured loops and array
expressions is planned for future patches.
2024-06-14 14:10:41 +01:00

33 lines
1.3 KiB
Plaintext

// RUN: fir-opt --fir-to-llvm-ir %s | FileCheck %s
#access_group = #llvm.access_group<id = distinct[0]<>>
// CHECK: #[[ACCESS:.*]] = #llvm.access_group<id = distinct[0]<>>
#loop_vectorize = #llvm.loop_vectorize<disable = false>
// CHECK: #[[VECTORIZE:.*]] = #llvm.loop_vectorize<disable = false>
#loop_annotation = #llvm.loop_annotation<vectorize = #loop_vectorize, parallelAccesses = #access_group>
// CHECK: #[[ANNOTATION:.*]] = #llvm.loop_annotation<vectorize = #[[VECTORIZE]], parallelAccesses = #[[ACCESS]]>
func.func @_QPvector_always() -> i32 {
%c1 = arith.constant 1 : index
%c10_i32 = arith.constant 10 : i32
%c1_i32 = arith.constant 1 : i32
%c10 = arith.constant 10 : index
%0 = arith.subi %c10, %c1 : index
%1 = arith.addi %0, %c1 : index
%2 = arith.divsi %1, %c1 : index
cf.br ^bb1(%c1, %c1_i32, %2 : index, i32, index)
^bb1(%3: index, %4: i32, %5: index): // 2 preds: ^bb0, ^bb2
%c0 = arith.constant 0 : index
%6 = arith.cmpi sgt, %5, %c0 : index
cf.cond_br %6, ^bb2, ^bb3 {loop_annotation = #loop_annotation}
// CHECK: llvm.cond_br %{{.*}}, ^{{.*}}, ^{{.*}} {loop_annotation = #[[ANNOTATION]]}
^bb2: // pred: ^bb1
%7 = arith.addi %3, %c1 : index
%c1_0 = arith.constant 1 : index
%8 = arith.subi %5, %c1_0 : index
cf.br ^bb1(%7, %c1_i32, %8 : index, i32, index)
^bb3: // pred: ^bb1
return %4 : i32
}