The current implementation of `!DIR IVDEP` leads flang to bypass LLVM cost model and always vectorize the loop carrying `!DIR$ IVDEP`. IVDEP is an extension and its documentation varies, and while it usually leads to vectorization because it is added on loops where it is usually profitable, its documentation only tells it is meant to tell the compiler that there are no loop carried dependencies and that the loop is safe to vectorize. In some application, such directive may have been added to help the compiler proving it is safe to vectorize, but vectorizing is not always the best choice for all architectures. The cost model should still be applied. This is at least the case for classic flang. When users want vectorization to happen, they should use `!DIR$ VECTOR ALWAYS`. This patch updates flang to not emit `llvm.loop.vectorize.enable` just because IVDEP was seen. Instead, IVDEP now only controls the emissions of the access groups to translate the independence of the accesses and leave the vectorization decision up to the cost model. `!DIR$ VECTOR ALWAYS` can be used in combination with IVDEP to force vectorization (it causes the emission of `llvm.loop.vectorize.enable`).
Flang
Flang is a ground-up implementation of a Fortran front end written in modern C++. It started off as the f18 project (https://github.com/flang-compiler/f18) with an aim to replace the previous flang project (https://github.com/flang-compiler/flang) and address its various deficiencies. F18 was subsequently accepted into the LLVM project and rechristened as Flang.
Please note that flang is not ready yet for production usage.
Getting Started
Read more about flang in the docs directory. Start with the compiler overview.
To better understand Fortran as a language and the specific grammar accepted by flang, read Fortran For C Programmers and flang's specifications of the Fortran grammar and the OpenMP grammar.
Treatment of language extensions is covered in this document.
To understand the compilers handling of intrinsics, see the discussion of intrinsics.
To understand how a flang program communicates with libraries at runtime, see the discussion of runtime descriptors.
If you're interested in contributing to the compiler, read the style guide and also review how flang uses modern C++ features.
If you are interested in writing new documentation, follow LLVM's Markdown style guide.
Consult the Getting Started with Flang for information on building and running flang.