- Aug 01, 2022
-
-
Fangrui Song authored
* Inline getReloc * Fold the UINT32_MAX length check into the section size check. This transformation is valid because we don't support .eh_frame input sections larger than 32-bit (unrealistic even for large code models).
-
Fangrui Song authored
This simplifies code, removes a read32 (for id==0 check), and makes it feasible to combine some operations in EhInputSection::split and EhFrameSection::addRecords. Mostly NFC, but fixes "Relocation not in any piece" assertion failure in an erroneous case when a relocation offset precedes all CIE/FDE pices.
-
Kazu Hirata authored
-
Kazu Hirata authored
-
Kazu Hirata authored
The function definition was removed on Apr 23, 2015 in commit 876a19d8, but the declaration has remained since.
-
Kazu Hirata authored
Identified with readability-redundant-string-init.
-
Kazu Hirata authored
Identified with readability-const-return-type.
-
Kazu Hirata authored
Identified with modernize-use-bool-literals.
-
Kazu Hirata authored
-
Kazu Hirata authored
-
NAKAMURA Takumi authored
-
Fangrui Song authored
-
Luís Marques authored
Expand load address pseudo-instructions earlier (pre-ra) to allow follow-up patches to fold the addi of PseudoLLA instructions into the immediate operand of load/store instructions. Differential Revision: https://reviews.llvm.org/D123264
-
Jacques Pienaar authored
-
Fangrui Song authored
If we change CieRecord *&rec = cieMap[{cie.data(), personality}]; to CieRecord *&rec = cieMap[{cie.data(), nullptr}]; The new test can catch the failure. -
Tue Ly authored
-
Jeff Niu authored
When dead-code analysis is run at the scope of a function, call ops to other functions at the same level were being marked as unreachable, since the analysis optimistically assumes the call op to have no known predecessors and that all predecessors are known, but the callee would never get visited. This patch fixes the bug by checking if a referenced function is above the top-level op of the analysis, and is thus considered an external callable. Fixes #56830 Reviewed By: zero9178 Differential Revision: https://reviews.llvm.org/D130829
-
Alexander Belyaev authored
This reverts commit e78d7637. Differential Revision: https://reviews.llvm.org/D130706
-
Alexander Belyaev authored
This reverts commit e8c28775.
-
Alexander Belyaev authored
Differential Revision: https://reviews.llvm.org/D130706
-
Fangrui Song authored
inputSections temporarily contains EhInputSection objects mainly for combineEhSections. Place EhInputSection objects into a new vector ehInputSections instead of inputSections.
-
- Jul 31, 2022
-
-
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.
-
Sanjay Patel authored
See issue #56775
-
Michał Górny authored
Differential Revision: https://reviews.llvm.org/D130837
-
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.
-
Jun Zhang authored
Without this patch, clang-repl incorrectly pass some tests when there's error occured. Signed-off-by:
Jun Zhang <jun@junz.org> Differential Revision: https://reviews.llvm.org/D130422
-
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.
-
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
-
Jun Zhang authored
Signed-off-by:Jun Zhang <jun@junz.org>
-
Fangrui Song authored
My lld executable is 1.6KiB smaller and some functions are now more efficient.
-
Fangrui Song authored
Keep the main SectionBase hierarchy in InputSection.h. And inline MergeInputSection::getParent.
-
Sunho Kim authored
-
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
-
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
-
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
-
Fangrui Song authored
-
Nico Weber authored
-
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:Srishti Srivastava <srishti.srivastava@polymagelabs.com> Reviewed By: Mogball Differential Revision: https://reviews.llvm.org/D124750
-
Sunho Kim authored
-
Sunho Kim authored
-