//===-IslExprBuilder.h - Helper to generate code for isl AST expressions --===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // //===----------------------------------------------------------------------===// #ifndef POLLY_ISL_EXPR_BUILDER_H #define POLLY_ISL_EXPR_BUILDER_H #include "polly/CodeGen/IRBuilder.h" #include "polly/Support/ScopHelper.h" #include "isl/isl-noexceptions.h" namespace llvm { // Provide PointerLikeTypeTraits for isl_id. template <> struct PointerLikeTypeTraits<isl_id *> { … }; } // namespace llvm namespace polly { class ScopArrayInfo; /// LLVM-IR generator for isl_ast_expr[essions] /// /// This generator generates LLVM-IR that performs the computation described by /// an isl_ast_expr[ession]. /// /// Example: /// /// An isl_ast_expr[ession] can look like this: /// /// (N + M) + 10 /// /// The IslExprBuilder could create the following LLVM-IR: /// /// %tmp1 = add nsw i64 %N /// %tmp2 = add nsw i64 %tmp1, %M /// %tmp3 = add nsw i64 %tmp2, 10 /// /// The implementation of this class is mostly a mapping from isl_ast_expr /// constructs to the corresponding LLVM-IR constructs. /// /// The following decisions may need some explanation: /// /// 1) Which data-type to choose /// /// isl_ast_expr[essions] are untyped expressions that assume arbitrary /// precision integer computations. LLVM-IR instead has fixed size integers. /// When lowering to LLVM-IR we need to chose both the size of the data type and /// the sign of the operations we use. /// /// At the moment, we hardcode i64 bit signed computations. Our experience has /// shown that 64 bit are generally large enough for the loop bounds that appear /// in the wild. Signed computations are needed, as loop bounds may become /// negative. /// /// It is possible to track overflows that occurred in the generated IR. See the /// description of @see OverflowState for more information. /// /// FIXME: Hardcoding sizes can cause issues: /// /// - On embedded systems and especially for high-level-synthesis 64 bit /// computations are very costly. /// /// The right approach is to compute the minimal necessary bitwidth and /// signedness for each subexpression during in the isl AST generation and /// to use this information in our IslAstGenerator. Preliminary patches are /// available, but have not been committed yet. /// class IslExprBuilder final { … }; } // namespace polly #endif