1. Aug 01, 2022
  2. Jul 31, 2022
    • Sanjay Patel's avatar
      [InstSimplify] fold FP rounding intrinsic with rounded operand · 02b3a358
      Sanjay Patel authored
      issue #56775
      
      I rearranged the Thumb2 codegen test to avoid simplifying the chain
      of rounding instructions. I'm assuming the intent of the test is
      to verify lowering of each of those intrinsics.
      02b3a358
    • Sanjay Patel's avatar
      [InstSimplify] add tests for FP rounding intrinsics; NFC · ba295492
      Sanjay Patel authored
      See issue #56775
      ba295492
    • Michał Górny's avatar
    • Simon Pilgrim's avatar
      [X86] getFauxShuffleMask - use DemandedElts variant of getTargetShuffleInputs. NFCI. · acb5abb7
      Simon Pilgrim authored
      We don't specify the demanded elts yet, this patch just rewires the getTargetShuffleInputs calls and gives an "all demanded elts" mask.
      acb5abb7
    • Jun Zhang's avatar
      [clang-repl] Fix incorrect return code · 9caee577
      Jun Zhang authored
      
      
      Without this patch, clang-repl incorrectly pass some tests when there's
      error occured.
      
      Signed-off-by: default avatarJun Zhang <jun@junz.org>
      
      Differential Revision: https://reviews.llvm.org/D130422
      9caee577
    • Simon Pilgrim's avatar
      [X86] combineX86ShufflesRecursively - determine demanded elts to pass to getTargetShuffleInputs · 9cdba333
      Simon Pilgrim authored
      Only PACKSS/PACKUS faux shuffles make use of the demanded elts at the moment, but this at least improves the handling of a couple of truncation patterns.
      9cdba333
    • Dawid Jurczak's avatar
      [NFC] Remove redundant CalculateSmallVectorDefaultInlinedElements usage from to_vector utility · 50eb5bcf
      Dawid Jurczak authored
      CalculateSmallVectorDefaultInlinedElements<..>::value is already used as default value for second template parameter in SmallVector class declaration.
      There is no need to pass it explicitly in to_vector.
      
      Extracted from: https://reviews.llvm.org/D129781
      
      Differential Revision: https://reviews.llvm.org/D130774
      50eb5bcf
    • Jun Zhang's avatar
      3da13953
    • Fangrui Song's avatar
      [lld] Change vector to SmallVector. NFC · 4b2b68d5
      Fangrui Song authored
      My lld executable is 1.6KiB smaller and some functions are now more efficient.
      4b2b68d5
    • Fangrui Song's avatar
      [ELF] Move SyntheticSections to InputSection.h. NFC · a465e79f
      Fangrui Song authored
      Keep the main SectionBase hierarchy in InputSection.h.
      And inline MergeInputSection::getParent.
      a465e79f
    • Sunho Kim's avatar
      [JITLink][COFF] Remove unused variable. · c559072e
      Sunho Kim authored
      c559072e
    • Sunho Kim's avatar
      [JITLink][COFF] Handle COMDAT symbol with offset. · b501770a
      Sunho Kim authored
      Handles COMDAT symbol with an offset and refactor the code to only generated symbol if the second symbol was encountered. This happens very infrequently but happens in recursive_mutex implementation of MSVC STL library.
      
      Reviewed By: lhames
      
      Differential Revision: https://reviews.llvm.org/D130454
      b501770a
    • Sunho Kim's avatar
      [JITLink][COFF][x86_64] Implement remaining IMAGE_REL_AMD64_REL32_*. · d86f903b
      Sunho Kim authored
      Implements remaining IMAGE_REL_AMD64_REL32_*. We only need IMAGE_REL_AMD64_REL32_4 for now but doing all remaining ones for completeness. (clang only uses IMAGE_REL_AMD64_REL32_1 and IMAGE_REL_AMD64_REL32)
      
      Reviewed By: lhames
      
      Differential Revision: https://reviews.llvm.org/D130452
      d86f903b
    • Sunho Kim's avatar
      [JITLink] Relax zero-fill edge assertions. · e7814511
      Sunho Kim authored
      Relax zero-fill edge assertions to only consider relocation edges. Keep-alive edges to zero-fill blocks can cause this assertion which is too strict.
      
      Reviewed By: lhames
      
      Differential Revision: https://reviews.llvm.org/D130450
      e7814511
    • Fangrui Song's avatar
      [ELF] Simplify getRankProximity. NFC · 0a28cfdf
      Fangrui Song authored
      0a28cfdf
    • Nico Weber's avatar
      [gn build] Port 88181375 more · 5c6181fd
      Nico Weber authored
      5c6181fd
    • srishti-cb's avatar
      [MLIR] Add a utility to sort the operands of commutative ops · b508c564
      srishti-cb authored
      
      
      Added a commutativity utility pattern and a function to populate it. The pattern sorts the operands of an op in ascending order of the "key" associated with each operand iff the op is commutative. This sorting is stable.
      
      The function is intended to be used inside passes to simplify the matching of commutative operations. After the application of the above-mentioned pattern, since the commutative operands now have a deterministic order in which they occur in an op, the matching of large DAGs becomes much simpler, i.e., requires much less number of checks to be written by a user in her/his pattern matching function.
      
      The "key" associated with an operand is the list of the "AncestorKeys" associated with the ancestors of this operand, in a breadth-first order.
      
      The operand of any op is produced by a set of ops and block arguments. Each of these ops and block arguments is called an "ancestor" of this operand.
      
      Now, the "AncestorKey" associated with:
      1. A block argument is `{type: BLOCK_ARGUMENT, opName: ""}`.
      2. A non-constant-like op, for example, `arith.addi`, is `{type: NON_CONSTANT_OP, opName: "arith.addi"}`.
      3. A constant-like op, for example, `arith.constant`, is `{type: CONSTANT_OP, opName: "arith.constant"}`.
      
      So, if an operand, say `A`, was produced as follows:
      
      ```
      `<block argument>`  `<block argument>`
                   \          /
                    \        /
                    `arith.subi`           `arith.constant`
                               \            /
                               `arith.addi`
                                      |
                                 returns `A`
      ```
      
      Then, the block arguments and operations present in the backward slice of `A`, in the breadth-first order are:
      `arith.addi`, `arith.subi`, `arith.constant`, `<block argument>`, and `<block argument>`.
      
      Thus, the "key" associated with operand `A` is:
      ```
      {
       {type: NON_CONSTANT_OP, opName: "arith.addi"},
       {type: NON_CONSTANT_OP, opName: "arith.subi"},
       {type: CONSTANT_OP, opName: "arith.constant"},
       {type: BLOCK_ARGUMENT, opName: ""},
       {type: BLOCK_ARGUMENT, opName: ""}
      }
      ```
      
      Now, if "keyA" is the key associated with operand `A` and "keyB" is the key associated with operand `B`, then:
      "keyA" < "keyB" iff:
      1. In the first unequal pair of corresponding AncestorKeys, the AncestorKey in operand `A` is smaller, or,
      2. Both the AncestorKeys in every pair are the same and the size of operand `A`'s "key" is smaller.
      
      AncestorKeys of type `BLOCK_ARGUMENT` are considered the smallest, those of type `CONSTANT_OP`, the largest, and `NON_CONSTANT_OP` types come in between. Within the types `NON_CONSTANT_OP` and `CONSTANT_OP`, the smaller ones are the ones with smaller op names (lexicographically).
      
      ---
      
      Some examples of such a sorting:
      
      Assume that the sorting is being applied to `foo.commutative`, which is a commutative op.
      
      Example 1:
      
      > %1 = foo.const 0
      > %2 = foo.mul <block argument>, <block argument>
      > %3 = foo.commutative %1, %2
      
      Here,
      1. The key associated with %1 is:
      ```
          {
           {CONSTANT_OP, "foo.const"}
          }
      ```
      2. The key associated with %2 is:
      ```
          {
           {NON_CONSTANT_OP, "foo.mul"},
           {BLOCK_ARGUMENT, ""},
           {BLOCK_ARGUMENT, ""}
          }
      ```
      
      The key of %2 < the key of %1
      Thus, the sorted `foo.commutative` is:
      > %3 = foo.commutative %2, %1
      
      Example 2:
      
      > %1 = foo.const 0
      > %2 = foo.mul <block argument>, <block argument>
      > %3 = foo.mul %2, %1
      > %4 = foo.add %2, %1
      > %5 = foo.commutative %1, %2, %3, %4
      
      Here,
      1. The key associated with %1 is:
      ```
          {
           {CONSTANT_OP, "foo.const"}
          }
      ```
      2. The key associated with %2 is:
      ```
          {
           {NON_CONSTANT_OP, "foo.mul"},
           {BLOCK_ARGUMENT, ""}
          }
      ```
      3. The key associated with %3 is:
      ```
          {
           {NON_CONSTANT_OP, "foo.mul"},
           {NON_CONSTANT_OP, "foo.mul"},
           {CONSTANT_OP, "foo.const"},
           {BLOCK_ARGUMENT, ""},
           {BLOCK_ARGUMENT, ""}
          }
      ```
      4. The key associated with %4 is:
      ```
          {
           {NON_CONSTANT_OP, "foo.add"},
           {NON_CONSTANT_OP, "foo.mul"},
           {CONSTANT_OP, "foo.const"},
           {BLOCK_ARGUMENT, ""},
           {BLOCK_ARGUMENT, ""}
          }
      ```
      
      Thus, the sorted `foo.commutative` is:
      > %5 = foo.commutative %4, %3, %2, %1
      
      Signed-off-by: default avatarSrishti Srivastava <srishti.srivastava@polymagelabs.com>
      
      Reviewed By: Mogball
      
      Differential Revision: https://reviews.llvm.org/D124750
      b508c564
    • Sunho Kim's avatar
      [JITLink][COFF] Remove obsolete FIXMEs. (NFC) · ee9cf336
      Sunho Kim authored
      ee9cf336
    • Sunho Kim's avatar
      ea75c258