1. Apr 05, 2024
    • Mehdi Amini's avatar
      Revert "[mlir][SCF] `ValueBoundsConstraintSet`: Support `scf.if` (branches) (#85895)" · 8487e059
      Mehdi Amini authored
      This reverts commit 6b30ffef.
      
      gcc7 bot is broken
      8487e059
    • Mehdi Amini's avatar
      Revert "[mlir][SCF][NFC] `ValueBoundsConstraintSet`: Simplify `scf.for` implementation (#86239)" · e5e1bc0a
      Mehdi Amini authored
      This reverts commit 24e44299.
      
      gcc7 bot is broken
      e5e1bc0a
    • Mehdi Amini's avatar
      Revert "[mlir][Arith] `ValueBoundsOpInterface`: Support `arith.select` (#86383)" · f2d8218e
      Mehdi Amini authored
      This reverts commit 62b58d34.
      
      gcc7 bot is broken.
      f2d8218e
    • Benjamin Maxwell's avatar
      [mlir][arith] Add result pretty printing for constant vscale values (#83565) · 0b7362c2
      Benjamin Maxwell authored
      In scalable code it is very common to have constant multiples of vscale,
      e.g. `4 * vscale`. This updates `arith.muli` to pretty print the result
      name in cases like this, so `4 * vscale` would be `%c4_vscale`.
      
      This makes reading IR dumps of scalable code a little nicer.
      0b7362c2
    • Mitch Phillips's avatar
      Revert "[llvm-objcopy] Add --compress-sections" · be8bc3cf
      Mitch Phillips authored
      This reverts commit 9e3b64b9.
      
      Reason: Broke the UBSan buildbot. See the comments in the pull request
      (https://github.com/llvm/llvm-project/pull/85036) for more information.
      be8bc3cf
    • NagyDonat's avatar
      [analyzer] Remove barely used class 'KnownSVal' (NFC) (#86953) · 163301d7
      NagyDonat authored
      The class `KnownSVal` was very magical abstract class within the `SVal`
      class hierarchy: with a hacky `classof` method it acted as if it was the
      common ancestor of the classes `UndefinedSVal` and `DefinedSVal`.
      
      However, it was only used in two `getAs<KnownSVal>()` calls and the
      signatures of two methods, which does not "pay for" its weird behavior,
      so I created this commit that removes it and replaces its use with more
      straightforward solutions.
      163301d7
    • NagyDonat's avatar
      [analyzer] Make recognition of hardened __FOO_chk functions explicit (#86536) · fb299cae
      NagyDonat authored
      
      
      In builds that use source hardening (-D_FORTIFY_SOURCE), many standard
      functions are implemented as macros that expand to calls of hardened
      functions that take one additional argument compared to the "usual"
      variant and perform additional input validation. For example, a `memcpy`
      call may expand to `__memcpy_chk()` or `__builtin___memcpy_chk()`.
      
      Before this commit, `CallDescription`s created with the matching mode
      `CDM::CLibrary` automatically matched these hardened variants (in a
      addition to the "usual" function) with a fairly lenient heuristic.
      
      Unfortunately this heuristic meant that the `CLibrary` matching mode was
      only usable by checkers that were prepared to handle matches with an
      unusual number of arguments.
      
      This commit limits the recognition of the hardened functions to a
      separate matching mode `CDM::CLibraryMaybeHardened` and applies this
      mode for functions that have hardened variants and were previously
      recognized with `CDM::CLibrary`.
      
      This way checkers that are prepared to handle the hardened variants will
      be able to detect them easily; while other checkers can simply use
      `CDM::CLibrary` for matching C library functions (and they won't
      encounter surprising argument counts).
      
      The initial motivation for refactoring this area was that previously
      `CDM::CLibrary` accepted calls with more arguments/parameters than the
      expected number, so I wasn't able to use it for `malloc` without
      accidentally matching calls to the 3-argument BSD kernel malloc.
      
      After this commit this "may have more args/params" logic will only
      activate when we're actually matching a hardened variant function (in
      `CDM::CLibraryMaybeHardened` mode). The recognition of "sprintf()" and
      "snprintf()" in CStringChecker was refactored, because previously it was
      abusing the behavior that extra arguments are accepted even if the
      matched function is not a hardened variant.
      
      This commit also fixes the oversight that the old code would've
      recognized e.g. `__wmemcpy_chk` as a hardened variant of `memcpy`.
      
      After this commit I'm planning to create several follow-up commits that
      ensure that checkers looking for C library functions use `CDM::CLibrary`
      as a "sane default" matching mode.
      
      This commit is not truly NFC (it eliminates some buggy corner cases),
      but it does not intentionally modify the behavior of CSA on real-world
      non-crazy code.
      
      As a minor unrelated change I'm eliminating the argument/variable
      "IsBuiltin" from the evalSprintf function family in CStringChecker,
      because it was completely unused.
      
      ---------
      
      Co-authored-by: default avatarBalazs Benics <benicsbalazs@gmail.com>
      fb299cae
    • AtariDreams's avatar
      [Thumb] Resolve FIXME: Use 'mov hi, $src; mov $dst, hi' (#81908) · c5d000b1
      AtariDreams authored
      Consider the following:
      
              ldr     r0, [r4]
              ldr     r7, [r0, #4]
              cmp     r7, r3
              bhi     .LBB0_6
              cmp     r0, r2
              push    {r0}
              pop     {r4}
              bne     .LBB0_3
              movs    r0, r6
              pop     {r4, r5, r6, r7}
              pop     {r1}
              bx      r1
      
      Here is a snippet of the generated THUMB1 code of the K&R malloc
      function that clang currently compiles to.
      
      push    {r0} ends up being popped to pop {r4}.
      
      movs r4, r0 would destroy the flags set by cmp right above.
      
      The compiler has no alternative in this case, except one:
      the only alternative is to transfer through a high register.
      
      However, it seems like LLVM does not consider that this is a valid
      approach, even though it is a free clobbering a high register.
      
      This patch addresses the FIXME so the compiler can do that when it can
      in r10 or r11, or r12.
      c5d000b1
    • Andrzej Warzynski's avatar
      [mlir][test] Extend CMake logic for e2e tests · 5ed60ffd
      Andrzej Warzynski authored
      Adds two new CMake functions to query the host system:
      
        * `check_hwcap`,
        * `check_emulator`.
      
      Together, these functions are used to check whether a given set of MLIR
      integration tests require an emulator. If yes, then the corresponding
      CMake var that defies the required emulator executable is also checked.
      
      `check_hwcap` relies on ELF_HWCAP for discovering CPU features from
      userspace on Linux systems. This is the recommended approach for Arm
      CPUs running on Linux as outlined in this blog post:
      
        * https://community.arm.com/arm-community-blogs/b/operating-systems-blog/posts/runtime-detection-of-cpu-features-on-an-armv8-a-cpu
      
      Other operating systems (e.g. Android) and CPU architectures will
      most likely require some other approach. Right now these new hooks are
      only used for SVE and SME integration tests.
      
      This relands #86489 with the following changes:
        * Replaced:
            `set(hwcap_test_file ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/hwcap_check.c)`
          with:
            `set(hwcap_test_file ${CMAKE_BINARY_DIR}/temp/hwcap_check.c)`
          The former would trigger an infinite loop when running `ninja`
          (after the initial CMake configuration).
        * Fixed commit msg. Previous one was taken from the initial GH PR
          commit rather than the final re-worked solution (missed this when
          merging via GH UI).
        * A couple more NFCs/tweaks.
      5ed60ffd
    • David Spickett's avatar
      Reland "[flang][clang] Add Visibility specific help text for options (#81869)" · aff197ff
      David Spickett authored
      This reverts commit 67d20412.
      
      This includes fixes for clanginstallapi.
      aff197ff
    • David Spickett's avatar
      Revert "[flang][clang] Add Visibility specific help text for options (#81869)" · 67d20412
      David Spickett authored
      This reverts commit 7e958f64.
      
      Failing on multiple bots.
      67d20412
    • David Spickett's avatar
      [flang][clang] Add Visibility specific help text for options (#81869) · 7e958f64
      David Spickett authored
      And use it to print the correct default OpenMP version for flang and
      flang -fc1.
      
      This change adds an optional `HelpTextsForVariants` to options. This
      allows you to change the help text that gets shown in documentation and
      `--help` based on the program its being generated for.
      
      As `OptTable` needs to be constexpr compatible, I have used a std::array
      of help text variants. Each entry is:
      (list of visibilities) - > help text string
      
      So for the OpenMP version we have (flang, fc1) -> "OpenMP version for
      flang is...".
      
      So you can have multiple visibilities use the same string. The number of
      entries is currently set to 1, and the number of visibilities per entry
      is 2, because that's the maximum we need for now. The code is written so
      we can increase these numbers later, and the unused elements will be initialised.
      
      I have not applied this to group descriptions just because I don't know
      of one that needs changing. It could easily be enabled for those too if
      needed. There are minor changes to them just to get it all to compile.
      
      This approach of storing many help strings per option in the 1 driver
      library seemed preferable to making a whole new library for Flang (even
      if that would mostly be including stuff from Clang).
      7e958f64
    • mlevesquedion's avatar
      Fix a few broken links (#87098) · 73fa6685
      mlevesquedion authored
      References to headings need to be preceded with a slash. Also,
      references to headings on the same page do not need to contain the name
      of the document (omitting the document name means if the name changes
      the links will still be valid).
      
      I double checked the links by building [the
      website](https://github.com/llvm/mlir-www):
      
      ```shell
      ./mlir-www-helper.sh --install-docs ../llvm-project website
      cd website && hugo serve
      ```
      73fa6685
    • Qizhi Hu's avatar
      [Clang][Sema] Skip checking anonymous enum in using enum declaration (#87144) · cfb86ae7
      Qizhi Hu authored
      Try to fix https://github.com/llvm/llvm-project/issues/86790
      
      
      `getFETokenInfo` requires `DeclarationName` shouldn't be empty and this
      will produce crash when checking name conflict of an anonymous
      `NamedDecl` in `Sema::PushOnScopeChains` and whether it's a reserved
      identifier or not. These wouldn't happen when it's a anonymous enum and
      we can skip the checking and just add the declaration to current scope.
      
      Co-authored-by: default avatarhuqizhi <836744285@qq.com>
      cfb86ae7
    • Christian Ulmann's avatar
      [MLIR][LLVM] Improve bit- and addrspacecast folders (#87745) · ef8322f4
      Christian Ulmann authored
      This commit extends the folders of chainable casts (bitcast and
      addrspacecast) to ensure that they fold a chain of the same casts into a
      single cast.
      
      Additionally cleans up the canonicalization test file, as this used some
      outdated constructs.
      ef8322f4
    • Christian Ulmann's avatar
      [MLIR][LLVM][Mem2Reg] Relax type equality requirement for load and store (#87637) · 974f1ee5
      Christian Ulmann authored
      This commit relaxes Mem2Reg's type equality requirement for the LLVM
      dialect's load and store operations. For now, we only allow loads to be
      promoted if the reaching definition can be casted into a value of the
      target type.
      
      For stores, the same conversion casting check is applied and we ensure
      that their result is properly casted to the type of the memory slot.
      This is necessary to satisfy assumptions of the general mem2reg pass, as
      it creates block arguments with the types of the memory slot.
      
      This relands https://github.com/llvm/llvm-project/pull/87504
      974f1ee5
    • Cyndy Ishida's avatar
    • Matthias Springer's avatar
      [mlir][Arith] `ValueBoundsOpInterface`: Support `arith.select` (#86383) · 62b58d34
      Matthias Springer authored
      This commit adds a `ValueBoundsOpInterface` implementation for
      `arith.select`. The implementation is almost identical to `scf.if`
      (#85895), but there is one special case: if the condition is a shaped
      value, the selection is applied element-wise and the result shape can be
      inferred from either operand.
      62b58d34
    • Vitaly Buka's avatar
    • Matthias Springer's avatar
      [mlir][SCF][NFC] `ValueBoundsConstraintSet`: Simplify `scf.for` implementation (#86239) · 24e44299
      Matthias Springer authored
      This commit simplifies the implementation of the
      `ValueBoundsOpInterface` for `scf.for` based on the newly added
      `ValueBoundsConstraintSet::compare` API and adds additional
      documentation.
      
      Previously, the interface implementation created a new constraint set
      just to check if the yielded value and iter_arg are equal. This was
      inefficient because constraints were added multiple times (to two
      different constraint sets) for ops that are inside the loop.
      24e44299
    • Matthias Springer's avatar
      [mlir][SCF] `ValueBoundsConstraintSet`: Support `scf.if` (branches) (#85895) · 6b30ffef
      Matthias Springer authored
      This commit adds support for `scf.if` to `ValueBoundsConstraintSet`.
      
      Example:
      ```
      %0 = scf.if ... -> index {
        scf.yield %a : index
      } else {
        scf.yield %b : index
      }
      ```
      
      The following constraints hold for %0:
      * %0 >= min(%a, %b)
      * %0 <= max(%a, %b)
      
      Such constraints cannot be added to the constraint set; min/max is not
      supported by `IntegerRelation`. However, if we know which one of %a and
      %b is larger, we can add constraints for %0. E.g., if %a <= %b:
      * %0 >= %a
      * %0 <= %b
      
      This commit required a few minor changes to the
      `ValueBoundsConstraintSet` infrastructure, so that values can be
      compared while we are still in the process of traversing the IR/adding
      constraints.
      6b30ffef
    • Younan Zhang's avatar
      [Clang][Sema] Fix the lambda call expression inside of a type alias declaration (#82310) · 843cc474
      Younan Zhang authored
      This patch attempts to fix the lambda call expression inside of a type
      alias declaration from two aspects:
      1. Defer the lambda call expression building until after we have
      sufficient template arguments. This avoids the overeager (and often
      wrong) semantic checking before the type alias instantiation.
      2. Properly obtain template arguments involving a template type alias
      for constraint checking.
      
      It is unfortunate that a `TypeAliasTemplateDecl` (or a `TypeAliasDecl`)
      is never a `DeclContext`, nor does it have an associated specialization
      Decl from which we could collect these template arguments. Thus, I added
      a new CodeSynthesisContext to record template arguments for alias
      declarations.
      
      Fixes https://github.com/llvm/llvm-project/issues/70601
      Fixes https://github.com/llvm/llvm-project/issues/76674
      Fixes https://github.com/llvm/llvm-project/issues/79555
      Fixes https://github.com/llvm/llvm-project/issues/81145
      Fixes https://github.com/llvm/llvm-project/issues/82104
      
      Note that this doesn't involve the fix for
      https://github.com/llvm/llvm-project/issues/28461. That seems different,
      and I'd like to leave it as a follow-up.
      843cc474
    • Congcong Cai's avatar
    • Youngsuk Kim's avatar
      [Clang] ReleaseNote item for 9dab2e30 · 66190af7
      Youngsuk Kim authored
      Add release item which was omitted at the time.
      66190af7
    • Farzon Lotfi's avatar
      [HLSL][DXIL][SPIRV] Implementation of an abstraction for intrinsic selection... · 1cb64d75
      Farzon Lotfi authored
      [HLSL][DXIL][SPIRV] Implementation of an abstraction for intrinsic selection of HLSL backends  (#87171)
      
      Start of #83882
      - `Builtins.td` - add the `hlsl` `all` elementwise builtin.
      - `CGBuiltin.cpp` - Show a use case for CGHLSLUtils via an `all`
      intrinsic codegen.
      - `CGHLSLRuntime.cpp` - move `thread_id` to use CGHLSLUtils.
      - `CGHLSLRuntime.h` - Create a macro to help pick the right intrinsic
      for the backend.
      - `hlsl_intrinsics.h` - Add the `all` api.
      - `SemaChecking.cpp` - Add `all` builtin type checking
      - `IntrinsicsDirectX.td` - Add the `all` `dx` intrinsic
      - `IntrinsicsSPIRV.td` - Add the `all` `spv` intrinsic
      
      Work still needed:
      - `SPIRVInstructionSelector.cpp` - Add an implementation of `OpAll` for
      `spv_all` intrinsic
      1cb64d75
    • Keith Smiley's avatar
      13417605
    • Owen Pan's avatar
      [clang-format] Fix a regression in annotating BK_BracedInit (#87450) · 7c9c38ea
      Owen Pan authored
      Fixes #86539.
      7c9c38ea
    • Vitaly Buka's avatar
      [clang][CodeGen] Remove SimplifyCFGPass preceding RemoveTrapsPass (#84852) · b76eb1dd
      Vitaly Buka authored
      There is no performance difference after switching to
      `llvm.experimental.hot`.
      b76eb1dd
    • Youngsuk Kim's avatar
      [Clang][Sema] Warn unused cxx vardecl which entirely consists condition expr... · 90453f4a
      Youngsuk Kim authored
      [Clang][Sema] Warn unused cxx vardecl which entirely consists condition expr of if/while/for construct (#87348)
      
      Emit `-Wunused-but-set-variable` warning on C++ variables whose
      declaration (with initializer) entirely consist the condition expression
      of a if/while/for construct but are not actually used in the body of the
      if/while/for construct.
      
      Fixes #41447
      90453f4a
    • Qizhi Hu's avatar
      [clang][ASTImporter] fix variable inline of CXX17 (#87314) · ab80d004
      Qizhi Hu authored
      Fix crash in the testcase from
      https://github.com/llvm/llvm-project/issues/75114#issuecomment-1872595956
      
      
      Forget to set inline of variable declaration would make
      `isThisDeclarationADefinition` get incorrect result and didn't get
      imported variable. This will lead to a new `VarTemplateDecl` being
      created and call `setDescribedVarTemplate` again which produces the
      crash.
      
      Co-authored-by: default avatarhuqizhi <836744285@qq.com>
      ab80d004
    • Vitaly Buka's avatar
      [clang][ubsan] Switch UBSAN optimization to `llvm.allow.{runtime,ubsan}.check()` (#84858) · a9d93873
      Vitaly Buka authored
      Intrinsic introduced with #84850. Intrinsics improves performance
      by 3% comparing to removing traps (on
      "test-suite/MultiSource/Benchmarks" with PGO+ThinLTO).
      
      The pass will be renamed with #84853.
      
      RFC:
      https://discourse.llvm.org/t/rfc-add-llvm-experimental-hot-intrinsic-or-llvm-hot/77641
      a9d93873
    • Shilei Tian's avatar
      [TableGen] Fix a potential crash when operand doesn't appear in the instruction pattern (#87663) · cfadf3f6
      Shilei Tian authored
      We have a check of whether an operand is in the instruction pattern, and
      emit an
      error if it is not, but we simply continue execution, including directly
      dereferencing a point-like object `InVal`, which will be just created
      when
      accessing the map. It contains a `nullptr` so dereferencing it causes
      crash.
      This is a very trivial fix.
      cfadf3f6
    • Craig Topper's avatar
      [RISCV][GISel] Make register bank selection for unary and binary arithmetic... · 852eb20b
      Craig Topper authored
      [RISCV][GISel] Make register bank selection for unary and binary arithmetic ops more generic. (#87593)
      
      This is inspired by AArch64's getSameKindOfOperandsMapping, but based on
      what RISC-V currently needs.
      
      This removes the special vector case for G_ADD/SUB and unifies integer
      and FP operations into the same handler.
      
      G_SEXTLOAD/ZEXTLOAD have been separated from integer since they should
      only be scalar integer and never vector.
      852eb20b
    • Vitaly Buka's avatar
      [NFC][UBSAN] Regenerate a test · 96a99a5e
      Vitaly Buka authored
      96a99a5e
    • Shubham Rastogi's avatar
      Revert "Debuginfod Testing & fixes: 3rd times the charm? (#87676)" · ca55ee88
      Shubham Rastogi authored
      This reverts commit d6713ad8.
      
      This changed was reverted because of greendragon failures such
      as
      
      Unresolved Tests (2):
        lldb-api :: debuginfod/Normal/TestDebuginfod.py
        lldb-api :: debuginfod/SplitDWARF/TestDebuginfodDWP.py
      ca55ee88
    • Alexey Bataev's avatar
      [LV, VP]VP intrinsics support for the Loop Vectorizer + adding new... · 413a66f3
      Alexey Bataev authored
      [LV, VP]VP intrinsics support for the Loop Vectorizer + adding new tail-folding mode using EVL. (#76172)
      
      This patch introduces generating VP intrinsics in the Loop Vectorizer.
      
      Currently the Loop Vectorizer supports vector predication in a very
      limited capacity via tail-folding and masked load/store/gather/scatter
      intrinsics. However, this does not let architectures with active vector
      length predication support take advantage of their capabilities.
      Architectures with general masked predication support also can only take
      advantage of predication on memory operations. By having a way for the
      Loop Vectorizer to generate Vector Predication intrinsics, which (will)
      provide a target-independent way to model predicated vector
      instructions. These architectures can make better use of their
      predication capabilities.
      
      Our first approach (implemented in this patch) builds on top of the
      existing tail-folding mechanism in the LV (just adds a new tail-folding
      mode using EVL), but instead of generating masked intrinsics for memory
      operations it generates VP intrinsics for loads/stores instructions. The
      patch adds a new VPlanTransforms to replace the wide header predicate
      compare with EVL and updates codegen for load/stores to use VP
      store/load with EVL.
      
      Other important part of this approach is how the Explicit Vector Length
      is computed. (VP intrinsics define this vector length parameter as
      Explicit Vector Length (EVL)). We use an experimental intrinsic
      `get_vector_length`, that can be lowered to architecture specific
      instruction(s) to compute EVL.
      
      Also, added a new recipe to emit instructions for computing EVL. Using
      VPlan in this way will eventually help build and compare VPlans
      corresponding to different strategies and alternatives.
      
      Differential Revision: https://reviews.llvm.org/D99750
      413a66f3
    • Paul Kirth's avatar
      [RISCV][NFC] Add isTargetAndroid API in RISCVSubtarget (#87671) · bffc0b65
      Paul Kirth authored
      This is required to set target specific code generation options for
      Android,
      like using the TLS slot for the stack protector.
      bffc0b65
    • Keith Smiley's avatar
      [bazel] Add support for building lldb (#87589) · 4b077ed5
      Keith Smiley authored
      This adds build configuration for building LLDB on macOS and Linux. It
      uses a default subset of features that should work out of the box with
      macOS + Ubuntu. It is notably missing python support right now, although
      some of the scaffolding is there, because of the complexity of linking a
      python dylib, especially if you plan to distribute the resulting
      liblldb.so.
      
      Most of this build file is pretty simple, one of the unfortunate
      patterns I had to use was to split the header and sources cc_library
      targets to break circular dependencies.
      4b077ed5
    • Michael Kruse's avatar
      [flang] Add --gcc-toolchain and --gcc-install-dir options to flang. (#87360) · 75e7e7d3
      Michael Kruse authored
      The `--gcc-toolchain` and `--gcc-install-dir` option were previously only visible to the Clang driver, but not Flang. These determine which assembler, linker, and libraries to use, e.g. for cross-compiling, and therefore are relevant for Flang as well.
      
      Tests are implemented using a mock GCC installation in `basic_cross_linux_tree` copied over from Clang's tests. The Clang driver already contains tests with `--driver-mode=flang` but `flang-new` is an entirely different executable (containing the `-fc1` stage) that should be tested as well. While not all files in `basic_cross_linux_tree` are strictly needed for testing those two driver flags, they will be necessarily needed for future added flags such as `--rtlib`.
       
      Also remove the entry `*.o` in flang's `.gitignore` since `crt*.o` files are needed in the GCC mock installation.
      
      Fixes #86729
      75e7e7d3
    • Vitaly Buka's avatar
      aa6ba232