- Sep 02, 2021
-
-
Philip Reames authored
There's a silent bug in our reasoning about zero strides. We assume that having a single static exit implies that if that exit is not taken, then the loop must be infinite. This ignores the potential for abnormal exits via exceptions. Consider the following example: for (uint_8 i = 0; i < 1; i += 0) { throw_on_thousandth_call(); } Our reasoning is such that we'd conclude this loop can't take the backedge as that would lead to a (presumed) infinite loop. In practice, this is a silent bug because the loopIsFiniteByAssumption returns false strictly more often than the loopHaNoAbnormalExits property. We could reasonable want to change that in the future, so fixing the codeflow now is worthwhile. Differential Revision: https://reviews.llvm.org/D109029 -
Jon Chesterfield authored
-
alex-t authored
Currently, the truncate selection dag node is expanded as a bitwise AND plus compare to 1. This change enables scalar comparison in the pattern if the truncate node is uniform. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D108925
-
Philip Reames authored
As mentioned in D108833, the logic for figuring out if a backedge is dead was somewhat interwoven with the SCEV based logic and the symbolic eval logic. This is my attempt at making the code easier to follow. Note that this is only NFC after the work done in 29fa37ec. Thanks to Nikita for catching that case. Differential Revision: https://reviews.llvm.org/D108848
-
Jon Chesterfield authored
The commandline flag to specify a particular openmp devicertl library currently errors like: ``` fatal error: cannot open file './runtimes/runtimes-bins/openmp/libomptarget': Is a directory ``` CommonArgs successfully appends the directory to the commandline args then mlink-builtin-bitcode rejects it. This patch is a point fix to that. If --libomptarget-amdgcn-bc-path=directory then append the expected name for the current architecture and go on as before. This is useful for test runners that don't hardcode the architecture. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D109057 -
Nikita Popov authored
With opaque pointers, no actual bitcasts will be present. Instead, there will be a mismatch between the call FunctionType and the function ValueType. Change the code to collect CallBases specifically (rather than general Uses) and compare these types. RAUW is no longer performed, as there would no longer be any bitcasts that can be RAUWd. Differential Revision: https://reviews.llvm.org/D108880
-
Sid Manning authored
Several instructions with potential TLS relocations were missing. This issue was found when building the Canadian LLVM toolchain.
-
Weiwei Li authored
This patch is to add Image Operands in SPIR-V Dialect and also let ImageDrefGather to use Image Operands. Image Operands are used in many image instructions. "Image Operands encodes what oprands follow, as per Image Operands". And ususally, they are optional to image instructions. The format of image operands looks like: %0 = spv.ImageXXXX %1, ... %3 : f32 ["Bias|Lod"](%4, %5 : f32, f32) -> ... This patch doesn’t implement all operands (see Section 3.14 in SPIR-V Spec) but provides a skeleton of it. There is TODO in verifyImageOperands function. Co-authored: Alan Liu <alanliu.yf@gmail.com> Reviewed by: antiagainst Differential Revision: https://reviews.llvm.org/D108501 -
Philip Reames authored
We'd special cased this logic to use pointer types for non-integral pointers, but there's no reason we can't do that for all pointer types. Doing it this was has a few advantages: a) The code itself becomes more straight forward, and easier to test. b) We avoid introducing ptrtoint into programs which didn't have them in the source. c) The resulting codegen is easier to analyze and simplify (mostly due to lack of ptrtoint). Note that there are some test diffs, but a) running them through instcombine helps a ton, and b) there's enough missing obvious transforms on both before and after IR that it's clear this isn't performance sensitive. This is mostly motivated by cleaning up mentions of non-integrals to have a clearer idea of what we actually need to support. Differential Revision: https://reviews.llvm.org/D104662
-
Scott Linder authored
Document the CSR AGPRs for GFX90A. Remove the TODO for gfx908, as the answer is that we don't mark any AGPRs as callee-saved except for GFX90A, i.e. the docs as-is are correct for gfx908. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D109009
-
Duncan P. N. Exon Smith authored
Document 'use-external-name' and the various bits of logic that make it work, to avoid others having to repeat the archival work (given that I added getFileRefReturnsCorrectNameForDifferentStatPath to FileManagerTest, seems possible I understood this once before!). - b59cf679 added 'use-external-name' to RedirectingFileSystem. This causes `stat`s to return the external name for a redirected file instead of the name it was accessed by, leaking it through the VFS. - d066d4c8 propagated the external name further through clang::FileManager. - 4dc5573a, which added clang::FileEntryRef to clang::FileManager, has complicated concession to account for this as well (since refactored a bit). The goal of 'use-external-name' is to enable Clang to report "real" file paths to users (via diagnostics) and to external tools (such as debuggers reading debug info and build systems reading `.d` files). I've added FIXMEs to look at other channels for communicating the external names, since the current implementation adds complexity to FileManager and exposes an inconsistent interface to clients. Besides that, the FileManager logic appears to be kicking in outside of 'use-external-name'. Seems that *some* vfs::FileSystem implementations canonicalize some paths returned by `stat` in *some* cases (the bug isn't fully understood yet). Volodymyr Sapsai is investigating, this at least better documents what *is* understood.
-
Jon Chesterfield authored
Windows separator problem. Fixing that broke another regex. This reverts commit 0173e024.
-
Jon Chesterfield authored
This reverts commit 7a228f87. Failing test case under CI
-
Siva Chandra Reddy authored
This patch adds a skeleton as a preparatory step for the next patch which adds the actual implementations of the condition variable functions. Reviewed By: michaelrj Differential Revision: https://reviews.llvm.org/D108947
-
Craig Topper authored
If the true and false values are the same, we don't need a SELECT_CC. This would normally be folded before a select is legalized to select_cc. The test case exploits the late legalization of vscale to trigger a case where they become identical after legalization. This works around an issue found on a test case in D107957. In that case the true/false values were both eventually 0 and the select was used by a vector AVL operand. The select_cc got expanded to control flow and a phi, but the phi inputs were both copies from X0. MachineIR optimizations simplified this to a single copy from X0 going into the vector instruction. This became the input of a vsetvli after vsetvli insertion. Then register coalescing folded the copy into the vsetvli. X0 as the source of a vsetvli is a special encoding and should not be created by coalesing. We need to fix our vsetvli handling to make sure this can never happen any other way, but removing the unneeded select is still a worthwhile optimization.
-
Kostya Serebryany authored
[ubsan] warn inside the sigaction interceptor if static linking is suspected, and continue instead of crashing on null deref [ubsan] warn inside the sigaction interceptor if static linking is suspected, and continue instead of crashing on null deref Reviewed By: kostik Differential Revision: https://reviews.llvm.org/D109081
-
Jon Chesterfield authored
-
Jon Chesterfield authored
Given D109057, change test runner to use the libomptarget-x-bc-path argument instead of the LIBRARY_PATH environment variable to find the device library. Also drop the use of LIBRARY_PATH environment variable as it is far too easy to pull in the device library from an unrelated toolchain by accident with the current setup. No loss in flexibility to developers as the clang commandline used here is still available. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D109061
-
Hongtao Yu authored
With the context split work, the context-based (an array of strings) sorting performed at profile load time is way more expansive than single-string-based sorting. This is likely due to auxiliary operations done on each array element, such as indirect references, std::min operations, also likely cache misses. In this change I'm presorting profiles during profile generation time to avoid sorting at compile time. Compared to the previous context-split work, this effectively cuts down compile time by 20% for one of our large services and brings us closer to non-CS build, with still a small gap in build time. Reviewed By: wenlei, wmi Differential Revision: https://reviews.llvm.org/D109036
-
Nikita Popov authored
Store the used element type in the InductionDescriptor. For typed pointers, it remains the pointer element type. For opaque pointers, we always use an i8 element type, such that the step is a simple offset. A previous version of this patch instead tried to guess the element type from an induction GEP, but this is not reliable, as the GEP may be hidden (see @both in iv_outside_user.ll). Differential Revision: https://reviews.llvm.org/D104795
-
Siva Chandra Reddy authored
Reviewed By: michaelrj Differential Revision: https://reviews.llvm.org/D109045
-
Mehdi Amini authored
In D104421, we changed the API for pass registration. Before you would write: void registerPass("my-pass", "My Pass Description.", [] { return createMyPass(); }); while now you’d only write: void registerPass([] { return createMyPass(); }); If you’re using TableGen to define your pass registration, you shouldn’t have anything to do. If you’re using directly the C++ API here are some changes. Your project may also be broken even if you use TableGen and you call the generated registration API in case your pass implementation didn’t inherit from the MyPassBase class generated by TableGen. If you don't use TableGen, the "my-pass" and "My Pass Description." fields must be provided by overriding methods on the pass itself: llvm::StringRef getArgument() const final { return "my-pass"; } llvm::StringRef getDescription() const final { return "My Pass Description."; } Reviewed By: rriddle Differential Revision: https://reviews.llvm.org/D104429 -
Philip Reames authored
This extends D108921 into a generic rule applied to constructing ExitLimits along all paths. The remaining paths (primarily howFarToZero) don't have the same reasoning about UB sensitivity as the howManyLessThan ones did. Instead, the remain cause for max counts being more precise than exact counts is that we apply context sensitive loop guards on the max path, and not on the exact path. That choice is mildly suspect, but out of scope of this patch. The MVETailPredication.cpp change deserves a bit of explanation. We were previously figuring out that two SCEVs happened to be equal because the happened to be identical. When we optimized one with context sensitive information, but not the other, we lost the ability to prove them equal. So, cover this case by subtracting and then applying loop guards again. Without this, we see changes in test/CodeGen/Thumb2/mve-blockplacement.ll Differential Revision: https://reviews.llvm.org/D109015
-
Nico Weber authored
In https://reviews.llvm.org/D47480 I complained that there's no positive form of this flag, so let's add one :) https://gcc.gnu.org/PR29931 also has a pending patch to add the positive form to gcc (but there's admittedly not a lot of movement on that bug). This doesn't change any defaults. Differential Revision: https://reviews.llvm.org/D108818
-
Alexander Yermolovich authored
This is used by BOLT to do patching of DebugInfo section, and Line Table. Directly by using find, and through getAttrFieldOffsetForUnit. Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D107874
-
Jon Chesterfield authored
The commandline flag to specify a particular openmp devicertl library currently errors like: ``` fatal error: cannot open file './runtimes/runtimes-bins/openmp/libomptarget': Is a directory ``` CommonArgs successfully appends the directory to the commandline args then mlink-builtin-bitcode rejects it. This patch is a point fix to that. If --libomptarget-amdgcn-bc-path=directory then append the expected name for the current architecture and go on as before. This is useful for test runners that don't hardcode the architecture. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D109057 -
Sanjay Patel authored
isFreeToInvert allows min/max with 'not' on both operands, so easing the argument restriction catches the case where that operand has one use. We already handle the sub-patterns when there are less uses: https://alive2.llvm.org/ce/z/8Jatm_ ...but this is another step towards parity with the equivalent icmp+select idioms ( D98152 ). Differential Revision: https://reviews.llvm.org/D109059
-
Sanjay Patel authored
This mimics the code for the corresponding cmp-select idiom. This also prevents an infinite loop because isFreeToInvert does not match constant expressions. So this patch solves the same problem as D108814 and obsoletes it, but my main motivation is to enhance the pattern matching to allow more invertible ops. That change will be a follow-up patch on top of this one. Differential Revision: https://reviews.llvm.org/D109058
-
Arthur Eubanks authored
-
Arthur Eubanks authored
Introduced in D108788. These are clearer.
-
Adrian Prantl authored
The OutermostLoad condition is supposed to strip the outermost DW_OP_deref operation because dbg.declares are implicitly indirect. This patch makes sure the heuristic is only applied to dbg.declare intrinsics and only if the outermost instruction is a load. This was found while qualifying the latest Swift compiler rebranch. rdar://82037764
-
Craig Topper authored
See description in test. Reviewed By: frasercrmck Differential Revision: https://reviews.llvm.org/D108965
-
LLVM GN Syncbot authored
-
Jon Chesterfield authored
Using rpath instead of LD_LIBRARY_PATH to find libomp.so and libomptarget.so lets one rerun the already built test executables without setting environment variables and removes the risk of the test runner picking up different libraries to the developer debugging the failure. rpath usually means runpath, which is not transitive, so set runpath on libomptarget itself so that it can find the plugins located next to it, spelled $ORIGIN. This provides sufficient functionality to drop D102043 Reviewed By: tianshilei1992 Differential Revision: https://reviews.llvm.org/D109071
-
Artem Belevich authored
libdevice bitcode provided by NVIDIA is linked with clang/LLVM-generated IR which uses nvptx*-nvidia-cuda triple. We need to mark them as compatible. Differential Revision: https://reviews.llvm.org/D108835
-
Mark de Wever authored
This implements the struct `__format_arg_store` and its dependencies: * the class basic_format_arg, * the class basic_format_args, * the class basic_format_context, * the function make_format_args, * the function wmake_format_args, * the function visit_format_arg, * several Standard required typedefs. The following parts will be implemented in a later patch: * the child class `basic_format_arg::handle`, * the function `basic_format_arg::basic_format_arg(const T* p)`. The following extension has been implemented: * the class basic_format_arg supports `__[u]int128_t` on platform where libc++ supports 128 bit integrals. Implements parts of: * P0645 Text Formatting Completes: * LWG3371 visit_format_arg and make_format_args are not hidden friends * LWG3542 basic_format_arg mishandles basic_string_view with custom traits Note https://mordante.github.io/blog/2021/06/05/format.html gives a bit more information about the goals and non-goals of this initial patch serie...
-
Arthur Eubanks authored
This is part one of a couple of patches to fully rename these methods. I've made the mistake of assuming that these indexes are for parameters multiple times, but actually they're based off of a weird indexing scheme AttributeList::AttrIndex where 0 is the return value and ~0 is the function. Hopefully renaming these methods will make this clearer. Ideally users should use more specific methods like AttributeList::getFnAttr(). This patch simply adds the name that we want in the end. This is so the removal of the methods with the original names happens in a separate change to make it easier for downstream users. This touches all relevant methods in AttributeList, CallBase, and Function. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D108788
-
Thomas Lively authored
Previously extra wide v4f32 to v4f64 extending loads would be legalized to v2f32 to v2f64 extending loads, which would then be scalarized by legalization. (v2f32 to v2f64 extending loads not produced by legalization were already being emitted correctly.) Instead, mark v2f32 to v2f64 extending loads as legal and explicitly lower them using promote_low. This regresses the addressing modes supported for the extloads not produced by legalization, but that's a fine trade off for now. Differential Revision: https://reviews.llvm.org/D108496
-
Hongtao Yu authored
std::vector pointers can be invalided while growing. Using std::list instead.
-
Amara Emerson authored
When we have an any-extending FPR bank load, none of the tablegen patterns match and we fall back to the C++ selector. Like with the truncating stores that were fixed recently, the C++ wasn't able to handle it and ended up generating invalid copies between different size regclasses. This change adds handling for this case, splitting the load into a regular load and a SUBREG_TO_REG to extend it into the original wide destination reg.
-