1. Sep 09, 2020
    • Krzysztof Parzyszek's avatar
    • Ties Stuij's avatar
      [ARM] Follow AACPS standard for volatile bit-fields access width · 514df1b2
      Ties Stuij authored
      This patch resumes the work of D16586.
      According to the AAPCS, volatile bit-fields should
      be accessed using containers of the widht of their
      declarative type. In such case:
      ```
      struct S1 {
        short a : 1;
      }
      ```
      should be accessed using load and stores of the width
      (sizeof(short)), where now the compiler does only load
      the minimum required width (char in this case).
      However, as discussed in D16586,
      that could overwrite non-volatile bit-fields, which
      conflicted with C and C++ object models by creating
      data race conditions that are not part of the bit-field,
      e.g.
      ```
      struct S2 {
        short a;
        int  b : 16;
      }
      ```
      Accessing `S2.b` would also access `S2.a`.
      
      The AAPCS Release 2020Q2
      (https://documentation-service.arm.com/static/5efb7fbedbdee951c1ccf186?token=)
      section 8.1 Data Types, page 36, "Volatile bit-fields -
      preserving number and width of container accesses" has been
      updated to avoid conflict with the C++ Memory Model.
      Now it reads in the note:
      ```
      This ABI does not place any restrictions on the access widths of bit-fields where the container
      overlaps with a non-bit-field member or where the container overlaps with any zero length bit-field
      placed between two other bit-fields. This is because the C/C++ memory model defines these as being
      separate memory locations, which can be accessed by two threads simultaneously. For this reason,
      compilers must be permitted to use a narrower memory access width (including splitting the access into
      multiple instructions) to avoid writing to a different memory location. For example, in
      struct S { int a:24; char b; }; a write to a must not also write to the location occupied by b, this requires at least two
      memory accesses in all current Arm architectures. In the same way, in struct S { int a:24; int:0; int b:8; };,
      writes to a or b must not overwrite each other.
      ```
      
      Patch D16586 was updated to follow such behavior by verifying that we
      only change volatile bit-field access when:
       - it won't overlap with any other non-bit-field member
       - we only access memory inside the bounds of the record
       - avoid overlapping zero-length bit-fields.
      
      Regarding the number of memory accesses, that should be preserved, that will
      be implemented by D67399.
      
      Differential Revision: https://reviews.llvm.org/D72932
      
      The following people contributed to this patch:
      - Diogo Sampaio
      - Ties Stuij
      514df1b2
    • Volkan Keles's avatar
    • Heejin Ahn's avatar
      [WebAssembly] Fix fixEndsAtEndOfFunction for try-catch · d25c17f3
      Heejin Ahn authored
      When the function return type is non-void and `end` instructions are at
      the very end of a function, CFGStackify's `fixEndsAtEndOfFunction`
      function fixes the corresponding block/loop/try's type to match the
      function's return type. This is applied to consecutive `end` markers at
      the end of a function. For example, when the function return type is
      `i32`,
      ```
      block i32    ;; return type is fixed to i32
        ...
        loop i32   ;; return type is fixed to i32
          ...
        end_loop
      end_block
      end_function
      ```
      
      But try-catch is a little different, because it consists of two parts:
      a try part and a catch part, and both parts' return type should satisfy
      the function's return type. Which means,
      ```
      try i32      ;; return type is fixed to i32
        ...
        block i32  ;; this should be changed i32 too!
          ...
        end_block
      catch
        ...
      end_try
      end_function
      ```
      As you can see in this example, it is not sufficient to only `end`
      instructions at the end of a function; in case of `try`, we should
      check instructions before `catch`es, in case their corresponding `try`'s
      type has been fixed.
      
      This changes `fixEndsAtEndOfFunction`'s algorithm to use a worklist
      that contains a reverse iterator, each of which is a starting point for
      a new backward `end` instruction search.
      
      Fixes https://bugs.llvm.org/show_bug.cgi?id=47413.
      
      Reviewed By: dschuff, tlively
      
      Differential Revision: https://reviews.llvm.org/D87207
      d25c17f3
    • Simon Pilgrim's avatar
      LiveRegUnits.h - reduce MachineRegisterInfo.h include. NFC. · 3c83b967
      Simon Pilgrim authored
      We only need to include MachineInstrBundle.h, but exposes an implicit dependency in MachineOutliner.h.
      
      Also, remove duplicate includes from LiveRegUnits.cpp + MachineOutliner.cpp.
      3c83b967
    • Lubomir Litchev's avatar
      Add an option for unrolling loops up to a factor. · e2394245
      Lubomir Litchev authored
      Currently, there is no option to allow for unrolling a loop up to a specific factor (specified by the user).
      The code for doing that is there and there are benefits when unrolling is done  to smaller loops (smaller than the factor specified).
      
      Reviewed By: bondhugula
      
      Differential Revision: https://reviews.llvm.org/D87111
      e2394245
    • Heejin Ahn's avatar
      [clang-tidy] Fix linking for FrontendOpenMP · 71133e8b
      Heejin Ahn authored
      Without this, builds with `-DBUILD_SHARED_LIBS=ON` fail.
      71133e8b
  2. Sep 08, 2020