platform/upstream/llvm.git
3 years agoNFC: Glob all python sources in the MLIR Python bindings.
Stella Laurenzo [Fri, 5 Mar 2021 04:46:47 +0000 (20:46 -0800)]
NFC: Glob all python sources in the MLIR Python bindings.

* Also switches to use symlinks vs copy as that enables edit-and-continue python development.
* Broken out of https://reviews.llvm.org/D97995 per request from reviewer.

Differential Revision: https://reviews.llvm.org/D98005

3 years ago[gvn] CSE gc.relocates based on meaning, not spelling
Philip Reames [Fri, 5 Mar 2021 18:16:12 +0000 (10:16 -0800)]
[gvn] CSE gc.relocates based on meaning, not spelling

The last two operands to a gc.relocate represent indices into the associated gc.statepoint's gc bundle list. (Effectively, gc.relocates are projections from the gc.statepoints multiple return values.)

We can use this to recognize when two gc.relocates are equivalent (and can be CSEd), even when the indices are non-equal. This is particular useful when considering a chain of multiple statepoints as it lets us eliminate all duplicate gc.relocates in a single pass.

Differential Revision: https://reviews.llvm.org/D97974

(Note: Part of the reviewed change was split and landed as f352463a)

3 years agoMark gc.relocate and gc.result as readnone
Philip Reames [Fri, 5 Mar 2021 18:07:17 +0000 (10:07 -0800)]
Mark gc.relocate and gc.result as readnone

For some reason, we had been marking gc.relocates as reading memory. There's no known reason for this, and I suspect it to be a legacy of very early implementation conservatism.  gc.relocate and gc.result are simply projections of the return values from the associated statepoint.  Note that the LangRef has always declared them readnone.

The EarlyCSE change is simply moving the special casing from readonly to readnone handling.

As noted by the test diffs, this does allow some additional CSE when relocates are separated by stores, but since we generate gc.relocates in batches, this is unlikely to help anything in practice.

This was reviewed as part of https://reviews.llvm.org/D97974, but split at reviewer request before landing.  The motivation is to enable the GVN changes in that patch.

3 years ago[tests] precommit some additional tests for D97974
Philip Reames [Fri, 5 Mar 2021 18:04:07 +0000 (10:04 -0800)]
[tests] precommit some additional tests for D97974

3 years ago[rs4gc] avoid insert base computation instructions for deopt uses
Philip Reames [Fri, 5 Mar 2021 17:55:36 +0000 (09:55 -0800)]
[rs4gc] avoid insert base computation instructions for deopt uses

If we have a value live over a call which is used for deopt at the call, we know that the value must be a base pointer. We can avoid potentially inserting IR to materialize a base for this value.

In it's current form, this is mostly a compile time optimization.   Building the base pointer graph (and then optimizing it away again) is a relatively expensive operation.  We also sometimes end up with better codegen in practice - due to failures in optimizing away the inserted base pointer propogation - but those are optimization bugs we're fixing concurrently.

The alternative to this would be to extend the base pointer inference with the ability to generally reuse multiple-base input instructions (phis and selects).  That's somewhat invasive and complicated, so we're defering it a bit longer.

Differential Revision: https://reviews.llvm.org/D97885

3 years ago[PowerPC][AIX] Enable the default AltiVec ABI on AIX
Zarko Todorovski [Fri, 5 Mar 2021 17:36:45 +0000 (12:36 -0500)]
[PowerPC][AIX] Enable the default AltiVec ABI on AIX

This patch adds support for the default AltiVec ABI for AIX.

Vector registers 20 through 31 are marked as reserved and cannot
be used in the default ABI. This patch adds handling for this case
and also remove the default AltiVec ABI errors.

Reviewed By: sfertile

Differential Revision: https://reviews.llvm.org/D96351

3 years ago[libcxx] [test] Add an option to ssh.py for using a different temp path
Martin Storsjö [Tue, 20 Oct 2020 18:23:41 +0000 (21:23 +0300)]
[libcxx] [test] Add an option to ssh.py for using a different temp path

If cross testing on Windows via WSL (at least with WSL 1), the Windows
executables can't be executed if they are in WSL specific directories
(like /tmp).

Differential Revision: https://reviews.llvm.org/D98028

3 years ago[libcxx] [test] Fix path.decompose for windows
Martin Storsjö [Thu, 15 Oct 2020 09:52:56 +0000 (12:52 +0300)]
[libcxx] [test] Fix path.decompose for windows

Add ifdefs to the test reference tables for cases where paths are
interpreted differently (paths that contain a root name).

Fix test assumptions regarding has_root_name() and is_absolute() and
add logic to verify the results of is_absolute() for the test cases in
the table.

Also add a testcase for the path "//net/", which seemed like an
omission.

Differential Revision: https://reviews.llvm.org/D89943

3 years ago[Utils] Add missing attributes in syntax files
Andrzej Warzynski [Fri, 5 Mar 2021 17:36:09 +0000 (17:36 +0000)]
[Utils] Add missing attributes in syntax files

Added the following attributes to all LLVM syntax files:
  * allocsize
  * cold
  * convergent
  * dereferenceable_or_null
  * hot
  * inaccessiblemem_or_argmemonly
  * inaccessiblememonly
  * inalloca
  * jumptable
  * nocallback
  * nocf_check
  * noduplicate
  * nofree
  * nomerge
  * noprofile
  * nosync
  * null_pointer_is_valid
  * optforfuzzing
  * preallocated
  * safestack
  * sanitize_hwaddress
  * sanitize_memtag
  * shadowcallstack
  * speculative_load_hardening
  * swifterror
  * syncscope
  * tailcc
  * willreturn

I generated that list by comparing:
  * Attributes.inc (generated from Attributes.td), and
  * the Vim syntax file: llvm/utils/vim/syntax/llvm.vim

My original intention was to focus on the Vim syntax file. Since other
syntax files are also out-of-date, I added these attributes (if missing)
to other files as well. Note that in the other sytnax files (i.e. for
Emacs, VScode and Kate), there will be other attributes missing too.

I've also sorted all attributes alphabetically. Otherwise it's really
hard to automate adding new attributes. And I think that it was the
original intent to keep all of them ordered alphabetically.

Differential Revision: https://reviews.llvm.org/D97627

3 years ago[mac/lld] Fix scale computation for vector ops in PAGEOFF12 relocations
Nico Weber [Fri, 5 Mar 2021 16:17:08 +0000 (11:17 -0500)]
[mac/lld] Fix scale computation for vector ops in PAGEOFF12 relocations

With this, llvm-tblgen no longer tries and fails to allocate 7953 petabyte
when it runs during the build. Instead, `check-llvm` with lld/mac as host
linker now completes without any failures on an m1 mac.

This vector op handling code matches what happens in:
- ld64's OutputFile::applyFixUps() in OutputFile.cpp for kindStoreARM64PageOff12
- lld.ld64.darwinold's offset12KindFromInstruction() in
  lld/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp for offset12scale16
- RuntimeDyld's decodeAddend() in
  llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h for
  ARM64_RELOC_PAGEOFF12

Fixes PR49444.

Differential Revision: https://reviews.llvm.org/D98053

3 years ago[LegalizeDAG] Implement promotion rules for SELECT_CC
LemonBoy [Fri, 5 Mar 2021 15:46:10 +0000 (16:46 +0100)]
[LegalizeDAG] Implement promotion rules for SELECT_CC

Implement the promotion rule for SELECT_CC nodes by upcasting all the parameters and downcasting the result.
The AArch64 target makes use of this rule and, since it was not implemented, in some cases the instruction selector would hit an assertion upon encountering the illegal node.

This patch requires D97840, the included test cases hit both problems.

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D97859

3 years ago[AMDGPU] Do not attempt sgpr spills to vgpr, when it is disabled
RamNalamothu [Fri, 5 Mar 2021 08:25:43 +0000 (13:55 +0530)]
[AMDGPU] Do not attempt sgpr spills to vgpr, when it is disabled

This covers a path missed in https://reviews.llvm.org/D95768.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D98013

3 years ago[gn build] allow setting clang_base_path to a source-absolute path
Nico Weber [Fri, 5 Mar 2021 17:13:51 +0000 (12:13 -0500)]
[gn build] allow setting clang_base_path to a source-absolute path

With this, you can set `clang_base_path = "//out/gn1"` in `out/gn2/args.gn` and
the build in out/gn2 will use clang and lld from out/gn1.

Setting `clang_base_path` to an absolute path (with e.g.
`clang_base_path = getenv("HOME") + "/src/..."`) should behave as before.

Differential Revision: https://reviews.llvm.org/D97989

3 years ago[lld/mac] fix clang-format violation from 0e319bd0be2
Nico Weber [Fri, 5 Mar 2021 17:12:56 +0000 (12:12 -0500)]
[lld/mac] fix clang-format violation from 0e319bd0be2

3 years ago[PowerPC] Update Copy/Paste encodings according to ISA3.1
Jinsong Ji [Fri, 5 Mar 2021 14:25:35 +0000 (14:25 +0000)]
[PowerPC] Update Copy/Paste encodings according to ISA3.1

Copy-paste P9 insns were added back in 2016,
however, looks like the opcodes has changed in ISA3.1.

Reviewed By: #powerpc, nemanjai

Differential Revision: https://reviews.llvm.org/D97416

3 years ago[DebugInfo] Add DIArgList MD to store multple values in DbgVariableIntrinsics
gbtozers [Wed, 30 Sep 2020 15:29:53 +0000 (16:29 +0100)]
[DebugInfo] Add DIArgList MD to store multple values in DbgVariableIntrinsics

This patch adds a new metadata node, DIArgList, which contains a list of SSA
values. This node is in many ways similar in function to the existing
ValueAsMetadata node, with the difference being that it tracks a list instead of
a single value. Internally, it uses ValueAsMetadata to track the individual
values, but there is also a reasonable amount of DIArgList-specific
value-tracking logic on top of that. Similar to ValueAsMetadata, it is a special
case in parsing and printing due to the fact that it requires a function state
(as it may reference function-local values).

This patch should not result in any immediate functional change; it allows for
DIArgLists to be parsed and printed, but debug variable intrinsics do not yet
recognize them as a valid argument (outside of parsing).

Differential Revision: https://reviews.llvm.org/D88175

3 years ago[mlir][sparse] mask reduction update
Aart Bik [Fri, 5 Mar 2021 03:05:37 +0000 (19:05 -0800)]
[mlir][sparse] mask reduction update

Reduction updates should be masked, just like the load and stores.
Note that alternatively, we could use the fact that masked values are
zero of += updates and mask invariants to get this working but that
would not work for *= updates. Masking the update itself is cleanest.
This change also replaces the constant mask with a broadcast of "true"
since this constant folds much better for various folding patterns.

Reviewed By: nicolasvasilache

Differential Revision: https://reviews.llvm.org/D98000

3 years ago[X86] X86ISelDAGToDAG.cpp - include cstdint instead of stdint.h NFCI.
Simon Pilgrim [Fri, 5 Mar 2021 14:02:00 +0000 (14:02 +0000)]
[X86] X86ISelDAGToDAG.cpp - include cstdint instead of stdint.h NFCI.

Fixes clang-tidy warning

3 years ago[X86] X86DAGToDAGISel::Select - merge X86::TEST load bitsize checks. NFCI.
Simon Pilgrim [Fri, 5 Mar 2021 13:55:57 +0000 (13:55 +0000)]
[X86] X86DAGToDAGISel::Select - merge X86::TEST load bitsize checks. NFCI.

3 years agoFix Wdocumentation unknown parameter warning. NFCI.
Simon Pilgrim [Fri, 5 Mar 2021 11:53:34 +0000 (11:53 +0000)]
Fix Wdocumentation unknown parameter warning. NFCI.

3 years ago[clang-tidy][NFC] Remove unsupported language version checks from vector
Nathan James [Fri, 5 Mar 2021 15:35:24 +0000 (15:35 +0000)]
[clang-tidy][NFC] Remove unsupported language version checks from vector

3 years agoAdded API for "masked" construct via two entrypoints: __kmpc_masked,
tlwilmar [Fri, 5 Mar 2021 15:21:39 +0000 (09:21 -0600)]
Added API for "masked" construct via two entrypoints: __kmpc_masked,
and __kmpc_end_masked. The "master" construct is deprecated. Changed
proc-bind keyword from "master" to "primary". Use of both master
construct and master as proc-bind keyword is still allowed, but
deprecated.

Remove references to "master" in comments and strings, and replace
with "primary" or "primary thread". Function names and variables were
not touched, nor were references to deprecated master construct. These
can be updated over time. No new code should refer to master.

3 years ago[flang][fir] Add diagnostic tests for FIR ops verifier
Valentin Clement [Fri, 5 Mar 2021 15:20:51 +0000 (10:20 -0500)]
[flang][fir] Add diagnostic tests for FIR ops verifier

Add diagnostic tests with fir-opt for the diagnostics emitted by the ops verifier

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D97996

3 years ago[mlir][Linalg] Fix order of dimensions in hoistPaddingOnTensors.
Nicolas Vasilache [Fri, 5 Mar 2021 15:08:10 +0000 (15:08 +0000)]
[mlir][Linalg] Fix order of dimensions in hoistPaddingOnTensors.

3 years ago[AArch64] Legalize horizontal fmax/fmin reductions on f16 vectors
LemonBoy [Fri, 5 Mar 2021 15:01:45 +0000 (16:01 +0100)]
[AArch64] Legalize horizontal fmax/fmin reductions on f16 vectors

Expand the horizontal reduction during the instruction selection phase, but only if the target doesn't support the full fp16 instruction set.

Fixes https://bugs.llvm.org/show_bug.cgi?id=49401

Reviewed By: aemerson

Differential Revision: https://reviews.llvm.org/D97840

3 years ago[mlir] Make cuInit() call thread-safe.
Christian Sigg [Fri, 5 Mar 2021 10:29:27 +0000 (11:29 +0100)]
[mlir] Make cuInit() call thread-safe.

Reviewed By: herhut

Differential Revision: https://reviews.llvm.org/D98024

3 years ago[libcxxabi] Add LIBCXXABI_HAS_WIN32_THREAD_API build option
Markus Böck [Fri, 5 Mar 2021 14:30:13 +0000 (15:30 +0100)]
[libcxxabi] Add LIBCXXABI_HAS_WIN32_THREAD_API build option

A few files in libc++abi make use of libc++ headers and a few of those use threading primitives provided by libc++. Since libc++ has multiple threading APIs it may be necessary to override auto-detection.

This patch adds the LIBCXXABI_HAS_WIN32_THREAD_API which does roughly the same as LIBCXXABI_HAS_PTHREAD_API and the similarly named LIBCXX_HAS_WIN32_THREAD_API from libc++. Instead of using autodetection it will force the use of win32 threads instead of pthreads in headers included from libc++.

Without this patch, libc++abi may depend on pthreads if present on the users build environment, even if win32 threading was selected for libc++.

Differential revision: https://reviews.llvm.org/D98021

3 years ago[XCOFF][DWARF] set default DWARF version to 3.
Chen Zheng [Fri, 5 Mar 2021 14:20:48 +0000 (09:20 -0500)]
[XCOFF][DWARF] set default DWARF version to 3.

Reviewed By: jsji

Differential Revision: https://reviews.llvm.org/D98010

3 years ago[lld/mac] minor formatting tweak to test just added in 0e319bd0be2
Nico Weber [Fri, 5 Mar 2021 14:16:55 +0000 (09:16 -0500)]
[lld/mac] minor formatting tweak to test just added in 0e319bd0be2

whitespace only, no behavior change

3 years ago[lld/mac] ad-hoc sign dylibs and bundles on arm64 by default, support -(no_)adhoc_cod...
Nico Weber [Fri, 5 Mar 2021 14:07:58 +0000 (09:07 -0500)]
[lld/mac] ad-hoc sign dylibs and bundles on arm64 by default, support -(no_)adhoc_codesign flags

Previously, lld/mac only ad-hoc codesigned executables on arm64.

Matches ld64 behavior. Part of PR49443. Fixes 14 of 17 failures when running
check-llvm with lld as host linker on an M1 MBP.

Differential Revision: https://reviews.llvm.org/D97994

3 years ago[BPF] Add support for floats and doubles
Ilya Leoshkevich [Fri, 5 Mar 2021 13:29:57 +0000 (14:29 +0100)]
[BPF] Add support for floats and doubles

Some BPF programs compiled on s390 fail to load, because s390
arch-specific linux headers contain float and double types. At the
moment there is no BTF_KIND for floats and doubles, so the release
version of LLVM ends up emitting type id 0 for them, which the
in-kernel verifier does not accept.

Introduce support for such types to libbpf by representing them using
the new BTF_KIND_FLOAT.

Reviewed By: yonghong-song

Differential Revision: https://reviews.llvm.org/D83289

3 years ago[clang-tidy] Use-after-move: Ignore moves inside a try_emplace.
Martin Boehme [Fri, 5 Mar 2021 12:16:00 +0000 (13:16 +0100)]
[clang-tidy] Use-after-move: Ignore moves inside a try_emplace.

We have no way to reason about the bool returned by try_emplace, so we
simply ignore any std::move()s that happen in a try_emplace argument.
A lot of the time in this situation, the code will be checking the
bool and doing something else if it turns out the value wasn't moved
into the map, and this has been causing false positives so far.

I don't currently have any intentions of handling "maybe move" functions
more generally.

Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D98034

3 years ago[HIP] do not use -munsafe-fp-atomics by default
Yaxun (Sam) Liu [Thu, 4 Mar 2021 18:15:54 +0000 (13:15 -0500)]
[HIP] do not use -munsafe-fp-atomics by default

A bug was introduced when adding -munsafe-fp-atomics.
By default it should be off.

Reviewed by: Artem Belevich

Differential Revision: https://reviews.llvm.org/D97967

3 years ago[HIP] do not use -mconstructor-aliases for device
Yaxun (Sam) Liu [Wed, 3 Mar 2021 21:42:57 +0000 (16:42 -0500)]
[HIP] do not use -mconstructor-aliases for device

Like nvptx and some other targets, -mconstructor-aliases does not work well with amdgpu,
therefore we disable it in the same approach.

Reviewed by: Artem Belevich

Differential Revision: https://reviews.llvm.org/D97959

3 years ago[OpenCL] Fix `mix` builtin overloads
Sven van Haastregt [Fri, 5 Mar 2021 13:43:30 +0000 (13:43 +0000)]
[OpenCL] Fix `mix` builtin overloads

`mix` is subtly different from `clamp`: in the overloads where the
last argument is a scalar, the second argument should be a gentype for
`mix`.

As scalars can be implicitly converted to vectors, this cannot be
caught in the Sema test.  Hence adding a CodeGen test, where we can
verify the types using the mangled name.

3 years ago[clang-format] Improve clang-format-diff.py error message
David Spickett [Fri, 5 Mar 2021 11:13:58 +0000 (11:13 +0000)]
[clang-format] Improve clang-format-diff.py error message

Previously if we couldn't run the clang-format command
for some reason, you'd get an unhelpful error message:
```
OSError: [Errno 2] No such file or directory
```

Which doesn't tell you what was happening to cause this.

Catch the error and add the command we were attempting to run:
```
RuntimeError: Failed to run "<...>/clang-food <...>" - No such file or directory"
RuntimeError: Failed to run "<...>/clang-format <...>" - Permission denied"
```

Reviewed By: krasimir

Differential Revision: https://reviews.llvm.org/D98032

3 years agoReapply "[DebugInfo] Add new instruction and DIExpression operator for variadic...
Stephen Tozer [Thu, 4 Mar 2021 12:02:28 +0000 (12:02 +0000)]
Reapply  "[DebugInfo] Add new instruction and DIExpression operator for variadic debug values"

Rewrites test to use correct architecture triple; fixes incorrect
reference in SourceLevelDebugging doc; simplifies `spillReg` behaviour
so as to not be dependent on changes elsewhere in the patch stack.

This reverts commit d2000b45d033c06dc7973f59909a0ad12887ff51.

3 years ago[test] Use host platform specific error message substitution in lit tests
Abhina Sreeskantharajan [Fri, 5 Mar 2021 12:20:51 +0000 (07:20 -0500)]
[test] Use host platform specific error message substitution in lit tests

This patch uses the errno python library to print out the correct error messages instead of hardcoding the error message per platform.

Reviewed By: jhenderson, ASDenysPetrov

Differential Revision: https://reviews.llvm.org/D97472

3 years ago[AMDGPU] Keep skip branch for ds instructions
Sebastian Neubauer [Thu, 4 Mar 2021 09:39:42 +0000 (10:39 +0100)]
[AMDGPU] Keep skip branch for ds instructions

Same as other memory instructions, ds instructions add latency even if
exec is zero. Jumping over them if exec=0 is cheaper than executing
them.
With this change, the branch instruction that skips over a basic block
if exec=0 is not removed when the block contains a ds instruction.

Differential Revision: https://reviews.llvm.org/D97922

3 years ago[AArch64] Add missing intrinsics for vrnd
Jingu Kang [Thu, 4 Mar 2021 14:40:01 +0000 (14:40 +0000)]
[AArch64] Add missing intrinsics for vrnd

3 years agoFix Wdocumentation unknown parameter warning. NFCI.
Simon Pilgrim [Fri, 5 Mar 2021 11:23:49 +0000 (11:23 +0000)]
Fix Wdocumentation unknown parameter warning. NFCI.

3 years ago[gn build] Port a60d06d8b757
LLVM GN Syncbot [Fri, 5 Mar 2021 11:09:38 +0000 (11:09 +0000)]
[gn build] Port a60d06d8b757

3 years agoRevert rG8198d83965ba4b9db6922b44ef3041030b2bac39: "[X86] Pass to transform amx intri...
Simon Pilgrim [Fri, 5 Mar 2021 10:52:42 +0000 (10:52 +0000)]
Revert rG8198d83965ba4b9db6922b44ef3041030b2bac39: "[X86] Pass to transform amx intrinsics to scalar operation."

This reverts commit 8198d83965ba4b9db6922b44ef3041030b2bac39.due to buildbot breakages

3 years ago[X86] X86ISelLowering.cpp - try to use for-range loops. NFCI.
Simon Pilgrim [Thu, 4 Mar 2021 18:53:07 +0000 (18:53 +0000)]
[X86] X86ISelLowering.cpp - try to use for-range loops. NFCI.

3 years ago[lld][WebAssembly] Allow element sections for nonzero table numbers
Andy Wingo [Thu, 4 Mar 2021 09:33:11 +0000 (10:33 +0100)]
[lld][WebAssembly] Allow element sections for nonzero table numbers

This patch fixes LLD to allow element sections for tables whose number
is nonzero.  We also add a test for linking multiple tables, showing
that nonzero table numbers for the indirect function table,
user-declared imported tables, and local user table definitions work.

Differential Revision: https://reviews.llvm.org/D92321

3 years ago[test] Fix new CodeGenPrepare test for non-X86 systems
Jann Horn [Fri, 5 Mar 2021 10:48:37 +0000 (11:48 +0100)]
[test] Fix new CodeGenPrepare test for non-X86 systems

The new test llvm/test/Transforms/CodeGenPrepare/remove-assume-block.ll
breaks on non-X86 machines. Change it to look like the existing test
llvm/test/Transforms/CodeGenPrepare/X86/delete-assume-dead-code.ll
to fix it.

Reviewed By: bkramer

Differential Revision: https://reviews.llvm.org/D97952

3 years ago[WebAssembly][yaml2obj][obj2yaml] Elem sections for nonzero tables
Andy Wingo [Thu, 4 Mar 2021 09:30:00 +0000 (10:30 +0100)]
[WebAssembly][yaml2obj][obj2yaml] Elem sections for nonzero tables

With reference types, tables can have non-zero table numbers.  This
commit adds support for element sections against these tables.

Differential Revision: https://reviews.llvm.org/D97923

3 years ago[clang][modules] Use extensible RTTI for ModuleFileExtension
Jan Svoboda [Mon, 1 Mar 2021 17:52:15 +0000 (18:52 +0100)]
[clang][modules] Use extensible RTTI for ModuleFileExtension

Clang exposes an interface for extending the PCM/PCH file format: `ModuleFileExtension`.

Clang itself has only a single implementation of the interface: `TestModuleFileExtension` that can be instantiated via the `-ftest-module-file_extension=` command line argument (and is stored in `FrontendOptions::ModuleFileExtensions`).

Clients of the Clang library can extend the PCM/PCH file format by pushing an instance of their extension class to the `FrontendOptions::ModuleFileExtensions` vector.

When generating the `-ftest-module-file_extension=` command line argument from `FrontendOptions`, a downcast is used to distinguish between the Clang's testing extension and other (client) extensions.

This functionality is enabled by LLVM-style RTTI. However, this style of RTTI is hard to extend, as it requires patching Clang (adding new case to the `ModuleFileExtensionKind` enum).

This patch switches to the LLVM RTTI for open class hierarchies, which allows libClang users (e.g. Swift) to create implementations of `ModuleFileExtension` without patching Clang. (Documentation of the feature: https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html#rtti-for-open-class-hierarchies)

Reviewed By: artemcm

Differential Revision: https://reviews.llvm.org/D97702

3 years agoReland AMDGPU/GlobalISel: Combine zext(trunc x) to x after RegBankSelect
Petar Avramovic [Thu, 4 Mar 2021 13:40:31 +0000 (14:40 +0100)]
Reland AMDGPU/GlobalISel: Combine zext(trunc x) to x after RegBankSelect

Recommit bf5a5826504754788a8f1e3fec7a7dc95cda5782. Depends on
4c8fb7ddd6fa49258e0e9427e7345fb56ba522d4 which was reverted.

RegBankSelect creates zext and trunc when it selects banks for uniform i1.
Add zext_trunc_fold from generic combiner to post RegBankSelect combiner.

Differential Revision: https://reviews.llvm.org/D95432

3 years agoReland [GlobalISel] Combine zext(trunc x) to x
Petar Avramovic [Thu, 4 Mar 2021 13:34:21 +0000 (14:34 +0100)]
Reland [GlobalISel] Combine zext(trunc x) to x

Recommit 4112299ee761a9b6a309c8ff4a7e75f8c8d8851b. Depends on
4c8fb7ddd6fa49258e0e9427e7345fb56ba522d4 which was reverted.

Combine zext(trunc x) to x when truncated bits are known to be zero.

Differential Revision: https://reviews.llvm.org/D96031

3 years ago[SVE][LoopVectorize] Add support for extracting the last lane of a scalable vector
David Sherwood [Fri, 15 Jan 2021 14:12:50 +0000 (14:12 +0000)]
[SVE][LoopVectorize] Add support for extracting the last lane of a scalable vector

There are certain loops like this below:

  for (int i = 0; i < n; i++) {
    a[i] = b[i] + 1;
    *inv = a[i];
  }

that can only be vectorised if we are able to extract the last lane of the
vectorised form of 'a[i]'. For fixed width vectors this already works since
we know at compile time what the final lane is, however for scalable vectors
this is a different story. This patch adds support for extracting the last
lane from a scalable vector using a runtime determined lane value. I have
added support to VPIteration for runtime-determined lanes that still permit
the caching of values. I did this by introducing a new class called VPLane,
which describes the lane we're dealing with and provides interfaces to get
both the compile-time known lane and the runtime determined value. Whilst
doing this work I couldn't find any explicit tests for extracting the last
lane values of fixed width vectors so I added tests for both scalable and
fixed width vectors.

Differential Revision: https://reviews.llvm.org/D95139

3 years ago[clang][cli] Fix generation of '-fvisibility' with regards to '-mignore-xcoff-visibility'
Jan Svoboda [Fri, 26 Feb 2021 14:11:11 +0000 (15:11 +0100)]
[clang][cli] Fix generation of '-fvisibility' with regards to '-mignore-xcoff-visibility'

This patch fixes failure of the `CodeGen/aix-ignore-xcoff-visibility.cpp` test with command line round-trip.

The absence of '-fvisibility' implies '-mignore-xcoff-visibility'.

The problem is that when '-fvisibility default' is passed to -cc1, it isn't being generated. (This adheres to the principle that generation doesn't produce arguments with default values.)

However, that caused '-mignore-xcoff-visibility' to be implied in the generated command line (without '-fvisibility'), while it wasn't implied in the original command line (with '-fvisibility').

This patch fixes that by always generating '-fvisibility' and explains the situation in comment.

(The '-mginore-xcoff-visibility' option was added in D87451).

Reviewed By: Bigcheese

Differential Revision: https://reviews.llvm.org/D97552

3 years ago[mlir][scf] Canonicalize scf.for last tensor iteration result.
Nicolas Vasilache [Thu, 4 Mar 2021 21:52:05 +0000 (21:52 +0000)]
[mlir][scf] Canonicalize scf.for last tensor iteration result.

Canonicalize the iter_args of an scf::ForOp that involve a tensor_load and
for which only the last loop iteration is actually visible outside of the
loop. The canonicalization looks for a pattern such as:
```
   %t0 = ... : tensor_type
   %0 = scf.for ... iter_args(%bb0 : %t0) -> (tensor_type) {
     ...
     // %m is either tensor_to_memref(%bb00) or defined above the loop
     %m... : memref_type
     ... // uses of %m with potential inplace updates
     %new_tensor = tensor_load %m : memref_type
     ...
     scf.yield %new_tensor : tensor_type
   }
```

`%bb0` may have either 0 or 1 use. If it has 1 use it must be exactly a
`%m = tensor_to_memref %bb0` op that feeds into the yielded `tensor_load`
op.

If no aliasing write of `%new_tensor` occurs between tensor_load and yield
then the value %0 visible outside of the loop is the last `tensor_load`
produced in the loop.

For now, we approximate the absence of aliasing by only supporting the case
when the tensor_load is the operation immediately preceding the yield.

The canonicalization rewrites the pattern as:
```
   // %m is either a tensor_to_memref or defined above
   %m... : memref_type
   scf.for ... { // no iter_args
     ... // uses of %m with potential inplace updates
   }
   %0 = tensor_load %m : memref_type
```

Differential revision: https://reviews.llvm.org/D97953

3 years ago[libc++] [C++2b] [P1682] Add to_underlying.
Marek Kurdej [Fri, 5 Mar 2021 08:19:39 +0000 (09:19 +0100)]
[libc++] [C++2b] [P1682] Add to_underlying.

* https://wg21.link/P1682

Reviewed By: ldionne, Mordante, #libc

Differential Revision: https://reviews.llvm.org/D97365

3 years ago[clangd] Rename Module -> FeatureModule to avoid confusion. NFC
Sam McCall [Thu, 4 Mar 2021 15:21:01 +0000 (16:21 +0100)]
[clangd] Rename Module -> FeatureModule to avoid confusion. NFC

As pointed out in D96244, "Module" is already pretty overloaded to refer
to clang and llvm modules. (And clangd deals directly with the former).

FeatureModule is a bit of a mouthful but it's pretty self-descriptive.
I think it might be better than "Component" which doesn't really capture
the "common interface" aspect - it's IMO confusing to refer to
"components" but exclude CDB for example.

Differential Revision: https://reviews.llvm.org/D97950

3 years ago[llvm-objcopy] Fix crash for binary input files with non-ascii names
James Henderson [Tue, 23 Feb 2021 15:32:45 +0000 (15:32 +0000)]
[llvm-objcopy] Fix crash for binary input files with non-ascii names

The code was using the standard isalnum function which doesn't handle
values outside the non-ascii range. Switching to using llvm::isAlnum
instead ensures we don't provoke undefined behaviour, which can in some
cases result in crashes.

Reviewed by: MaskRay

Differential Revision: https://reviews.llvm.org/D97663

3 years ago[llvm-objcopy][test] Fix test that could have passed spuriously
James Henderson [Thu, 25 Feb 2021 15:50:48 +0000 (15:50 +0000)]
[llvm-objcopy][test] Fix test that could have passed spuriously

The test was showing that when --strip-unneeded is specified for an
executable, all the symbols are stripped. However, the set of symbols
used in the test would be stripped by --strip-unneeded for an ET_REL
object too. Fix this by adding additional symbols that aren't normally
stripped by --strip-unneeded.

Reviewed by: MaskRay

Differential Revision: https://reviews.llvm.org/D97664

3 years ago[profile][test] Pin Linux/instrprof-value-prof-warn.test to -fuse-ld=bfd
Fangrui Song [Fri, 5 Mar 2021 08:52:25 +0000 (00:52 -0800)]
[profile][test] Pin Linux/instrprof-value-prof-warn.test to -fuse-ld=bfd

To work around https://sourceware.org/bugzilla/show_bug.cgi?id=27490

3 years ago[libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows
Martin Storsjö [Sat, 27 Feb 2021 14:09:49 +0000 (16:09 +0200)]
[libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows

Opening a path like \\server (without a trailing share name and
path) produces this error, while opening e.g. \\server\share
(for a nonexistent server/share) produces ERROR_BAD_NETPATH (which
already is mapped).

This happens in some testcases (in fs.op.proximate); as proximate()
calls weakly_canonical() on the inputs, weakly_canonical() checks
whether the path exists or not. When the error code wasn't recognized
(it mapped to errc::invalid_argument), the stat operation wasn't
conclusive and weakly_canonical() errored out. With the proper error
code mapping, this isn't considered an error, just a nonexistent
path, and weakly_canonical() can proceed.

This roughly matches what MS STL does - it doesn't have
ERROR_BAD_PATHNAME in its error code mapping table, but it
checks for this error code specifically in the return of their
correspondence of the stat function.

Differential Revision: https://reviews.llvm.org/D97619

3 years ago[libcxx] Avoid infinite recursion in create_directories, if the root directory doesn...
Martin Storsjö [Sat, 27 Feb 2021 17:12:25 +0000 (19:12 +0200)]
[libcxx] Avoid infinite recursion in create_directories, if the root directory doesn't exist

Differential Revision: https://reviews.llvm.org/D97618

3 years ago[libcxx] Implement semaphores for windows
Martin Storsjö [Thu, 25 Feb 2021 22:41:35 +0000 (00:41 +0200)]
[libcxx] Implement semaphores for windows

Also add WIN32_LEAN_AND_MEAN before including windows.h, for consistency
with other sources.

Differential Revision: https://reviews.llvm.org/D97539

3 years ago[asan][test] Don't XFAIL Posix/unpoison-alternate-stack.cpp on Solaris
Rainer Orth [Fri, 5 Mar 2021 08:43:47 +0000 (09:43 +0100)]
[asan][test] Don't XFAIL Posix/unpoison-alternate-stack.cpp on Solaris

One ASan test currently `XPASS`es on Solaris:

  AddressSanitizer-i386-sunos :: TestCases/Posix/unpoison-alternate-stack.cpp

It was originally `XFAIL`ed in D88501 <https://reviews.llvm.org/D88501>
because `longjmp` from a signal handled is highly unportable, warned
against in XPG7, and was not supported by Solaris `libc` at the time.

However, since then support has been added for some cases including the
current one, so the `XFAIL` can go.

Tested on `amd64-pc-solaris2.11` and `x86_64-pc-linux-gnu`.

Differential Revision: https://reviews.llvm.org/D97933

3 years ago[asan][test] Don't XFAIL Posix/no_asan_gen_globals.c on Solaris
Rainer Orth [Fri, 5 Mar 2021 08:42:29 +0000 (09:42 +0100)]
[asan][test] Don't XFAIL Posix/no_asan_gen_globals.c on Solaris

One ASan test currently `XPASS`es on Solaris:

  AddressSanitizer-i386-sunos :: TestCases/Posix/no_asan_gen_globals.c

It was originally `XFAIL`ed in D88218 <https://reviews.llvm.org/D88218>
because Solaris `ld`, unlike GNU `ld`, doesn't strip local labels.  Since
then, the integrated assembler has stopped emitting those local labels, so
the difference becomes moot and the `XFAIL` can go.

Tested on `amd64-pc-solaris2.11` and `x86_64-pc-linux-gnu`.

Differential Revision: https://reviews.llvm.org/D97932

3 years ago[X86] Pass to transform amx intrinsics to scalar operation.
Luo, Yuanke [Thu, 4 Mar 2021 01:42:06 +0000 (09:42 +0800)]
[X86] Pass to transform amx intrinsics to scalar operation.

This pass runs in any situations but we skip it when it is not O0 and the
function doesn't have optnone attribute. With -O0, the def of shape to amx
intrinsics is near the amx intrinsics code. We are not able to find a
point which post-dominate all the shape and dominate all amx intrinsics.
To decouple the dependency of the shape, we transform amx intrinsics
to scalar operation, so that compiling doesn't fail. In long term, we
 should improve fast register allocation to allocate amx register.

Reviewed By: pengfei

Differential Revision: https://reviews.llvm.org/D93594

3 years ago[JITLink] Fix Wtype-limits gcc warning (NFC)
Yang Fan [Fri, 5 Mar 2021 07:27:10 +0000 (15:27 +0800)]
[JITLink] Fix Wtype-limits gcc warning (NFC)

GCC warning:
```
In file included from /usr/include/c++/9/cassert:44,
from /home/vsts/work/1/llvm-project/llvm/include/llvm/ADT/BitVector.h:21,
from /home/vsts/work/1/llvm-project/llvm/include/llvm/Support/Program.h:17,
from /home/vsts/work/1/llvm-project/llvm/include/llvm/Support/Process.h:32,
from /home/vsts/work/1/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp:11:
/home/vsts/work/1/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp: In member function ‘virtual llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::Allocation> > llvm::jitlink::InProcessMemoryManager::allocate(const llvm::jitlink::JITLinkDylib*, const SegmentsRequestMap&)’:
/home/vsts/work/1/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp:129:40: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
129 |   assert(SlabRemaining.allocatedSize() >= 0 && "Mapping exceeds allocation");
    |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
```

The return type of `allocatedSize()` is `size_t`, thus the expression
`SlabRemaining.allocatedSize() >= 0` always evaluate to `true`.

3 years ago[SelectionDAG] Assert that operands to SelectionDAG::getNode are not DELETED_NODE...
Craig Topper [Fri, 5 Mar 2021 07:05:30 +0000 (23:05 -0800)]
[SelectionDAG] Assert that operands to SelectionDAG::getNode are not DELETED_NODE to catch issues like PR49393 earlier.

I'm not sure this would catch all such issues, but it would catch some.

The problem for PR49393 was that we were holding a reference to a node that
wasn't connect edto the DAG across a function that could delete unused nodes. In
this particular case we managed to try to use the deleted node while it was in
the deleted state before its memory got recycled.

It could also happen that we delete the node, something allocates a new node
which recycles the memory. Then  we try to use the reference we were holding and
it is now a completely different node with different valid opcode. This patch
would not catch that.

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D97969

3 years ago[TargetLowering] Use HandleSDNodes to prevent nodes from being deleted by recursive...
Craig Topper [Fri, 5 Mar 2021 06:30:38 +0000 (22:30 -0800)]
[TargetLowering] Use HandleSDNodes to prevent nodes from being deleted by recursive calls in getNegatedExpression.

For binary or ternary ops we call getNegatedExpression multiple
times and then compare costs. While we're doing this we need to
hold a node from the first call across the second call, but its
not yet attached to the DAG. Its possible the second call creates
an identical node and then decides it didn't need it so will try
to delete it if it has no uses. This can cause a reference to the
node we're holding further up the call stack to become invalidated.

To prevent this, we can use a HandleSDNode to artifically give
the node a use without connecting it to the DAG.

I've used a std::list of HandleSDNodes so we can create handles
only when we have a node to hold. HandleSDNode does not have
default constructor and cannot be copied or moved.

Fixes PR49393.

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D97914

3 years ago[Driver][test] Fix ClangDriverTest
Fangrui Song [Fri, 5 Mar 2021 06:44:37 +0000 (22:44 -0800)]
[Driver][test] Fix ClangDriverTest

3 years ago[Driver] Switch Exherbo/Alpine/Arch Linux to /etc/os-release
Fangrui Song [Fri, 5 Mar 2021 06:31:05 +0000 (22:31 -0800)]
[Driver] Switch Exherbo/Alpine/Arch Linux to /etc/os-release

3 years ago[libcxx] fixes up some [concepts]-related code
Christopher Di Bella [Fri, 5 Mar 2021 06:07:45 +0000 (22:07 -0800)]
[libcxx] fixes up some [concepts]-related code

* moves `std::copy_constructible` so it comes before
  `std::equality_comparable_with`
* replaces a few uses of `auto`

3 years ago[DebugInfo] Delete unused DIVariable::getSource
Fangrui Song [Fri, 5 Mar 2021 05:53:13 +0000 (21:53 -0800)]
[DebugInfo] Delete unused DIVariable::getSource

3 years ago[DebugInfo] Delete deleted getLine/getColumn
Fangrui Song [Fri, 5 Mar 2021 05:49:21 +0000 (21:49 -0800)]
[DebugInfo] Delete deleted getLine/getColumn

r250405 deleted the functions from DILexicalBlockBase.

3 years ago[lldb] Rename QueueFundamentalPlan to QueueBasePlan (NFC)
Dave Lee [Tue, 2 Mar 2021 21:18:35 +0000 (13:18 -0800)]
[lldb] Rename QueueFundamentalPlan to QueueBasePlan (NFC)

Minor change for naming consistency.

Differential Revision: https://reviews.llvm.org/D97985

3 years ago[clang][StaticAnalyzer] Compilation fix.
Michael Kruse [Fri, 5 Mar 2021 05:21:29 +0000 (23:21 -0600)]
[clang][StaticAnalyzer] Compilation fix.

An enum was unhandled after landing of D94973. Add the new
OMPCanonicalLoopClass to the list of unhandled cases.

3 years ago[sanitizer,NFC] Fix long comment formating
Vitaly Buka [Fri, 5 Mar 2021 04:57:11 +0000 (20:57 -0800)]
[sanitizer,NFC] Fix long comment formating

3 years ago[clang][OpenMP] Use OpenMPIRBuilder for workshare loops.
Michael Kruse [Wed, 3 Mar 2021 23:15:32 +0000 (17:15 -0600)]
[clang][OpenMP] Use OpenMPIRBuilder for workshare loops.

Initial support for using the OpenMPIRBuilder by clang to generate loops using the OpenMPIRBuilder. This initial support is intentionally limited to:
 * Only the worksharing-loop directive.
 * Recognizes only the nowait clause.
 * No loop nests with more than one loop.
 * Untested with templates, exceptions.
 * Semantic checking left to the existing infrastructure.

This patch introduces a new AST node, OMPCanonicalLoop, which becomes parent of any loop that has to adheres to the restrictions as specified by the OpenMP standard. These restrictions allow OMPCanonicalLoop to provide the following additional information that depends on base language semantics:
 * The distance function: How many loop iterations there will be before entering the loop nest.
 * The loop variable function: Conversion from a logical iteration number to the loop variable.

These allow the OpenMPIRBuilder to act solely using logical iteration numbers without needing to be concerned with iterator semantics between calling the distance function and determining what the value of the loop variable ought to be. Any OpenMP logical should be done by the OpenMPIRBuilder such that it can be reused MLIR OpenMP dialect and thus by flang.

The distance and loop variable function are implemented using lambdas (or more exactly: CapturedStmt because lambda implementation is more interviewed with the parser). It is up to the OpenMPIRBuilder how they are called which depends on what is done with the loop. By default, these are emitted as outlined functions but we might think about emitting them inline as the OpenMPRuntime does.

For compatibility with the current OpenMP implementation, even though not necessary for the OpenMPIRBuilder, OMPCanonicalLoop can still be nested within OMPLoopDirectives' CapturedStmt. Although OMPCanonicalLoop's are not currently generated when the OpenMPIRBuilder is not enabled, these can just be skipped when not using the OpenMPIRBuilder in case we don't want to make the AST dependent on the EnableOMPBuilder setting.

Loop nests with more than one loop require support by the OpenMPIRBuilder (D93268). A simple implementation of non-rectangular loop nests would add another lambda function that returns whether a loop iteration of the rectangular overapproximation is also within its non-rectangular subset.

Reviewed By: jdenny

Differential Revision: https://reviews.llvm.org/D94973

3 years ago[dfsan,NFC] Suppress cpplint warning
Vitaly Buka [Fri, 5 Mar 2021 04:42:18 +0000 (20:42 -0800)]
[dfsan,NFC] Suppress cpplint warning

3 years ago[LangRef] lifetime intrinsics: don't use word 'offset'
Juneyoung Lee [Fri, 5 Mar 2021 03:52:32 +0000 (12:52 +0900)]
[LangRef] lifetime intrinsics: don't use word 'offset'

from Philip's comments

3 years ago[clang][AST] Fix Wreturn-type gcc warning (NFC)
Yang Fan [Fri, 5 Mar 2021 03:24:55 +0000 (11:24 +0800)]
[clang][AST] Fix Wreturn-type gcc warning (NFC)

GCC warning:
```
/llvm-project/clang-tools-extra/clangd/SemanticHighlighting.cpp: In function ‘bool clang::clangd::{anonymous}::canHighlightName(clang::DeclarationName)’:
/llvm-project/clang-tools-extra/clangd/SemanticHighlighting.cpp:64:1: warning: control reaches end of non-void function [-Wreturn-type]
   64 | }
      | ^
```

3 years ago[RISCV] Enable fixed-length vectorization of LoopVectorizer for RISC-V Vector
Luke [Fri, 26 Feb 2021 14:10:30 +0000 (22:10 +0800)]
[RISCV] Enable fixed-length vectorization of LoopVectorizer for RISC-V Vector

By implementing the method "unsigned RISCVTTIImpl::getRegisterBitWidth(bool Vector)",
fixed-length vectorization is enabled when possible. Without this method, the
"#pragma clang loop" directive is needed to enable vectorization(or the cost model
may inform LLVM that "Vectorization is possible but not beneficial").

Reviewed By: frasercrmck

Differential Revision: https://reviews.llvm.org/D97549

3 years ago[SampleFDO] Another fix to prevent repeated indirect call promotion in
Wei Mi [Sat, 20 Feb 2021 06:43:21 +0000 (22:43 -0800)]
[SampleFDO] Another fix to prevent repeated indirect call promotion in
sample loader pass.

In https://reviews.llvm.org/rG5fb65c02ca5e91e7e1a00e0efdb8edc899f3e4b9,
to prevent repeated indirect call promotion for the same indirect call
and the same target, we used zero-count value profile to indicate an
indirect call has been promoted for a certain target. We removed
PromotedInsns cache in the same patch. However, there was a problem in
that patch described below, and that problem led me to add PromotedInsns
back as a mitigation in
https://reviews.llvm.org/rG4ffad1fb489f691825d6c7d78e1626de142f26cf.

When we get value profile from metadata by calling getValueProfDataFromInst,
we need to specify the maximum possible number of values we expect to read.
We uses MaxNumPromotions in the last patch so the maximum number of value
information extracted from metadata is MaxNumPromotions. If we have many
values including zero-count values when we write the metadata, some of them
will be dropped when we read them because we only read MaxNumPromotions
values. It will allow repeated indirect call promotion again. We need to
make sure if there are values indicating promoted targets, those values need
to be saved in metadata with higher priority than other values.

The patch fixed that problem. We change to use -1 to represent the count
of a promoted target instead of 0 so it is easier to sort the values.
When we prepare to update the metadata in updateIDTMetaData, we will sort
the values in the descending count order and extract only MaxNumPromotions
values to write into metadata. Since -1 is the max uint64_t number, if we
have equal to or less than MaxNumPromotions of -1 count values, they will
all be kept in metadata. If we have more than MaxNumPromotions of -1 count
values, we will only save MaxNumPromotions such values maximally. In such
case, we have logic in place in doesHistoryAllowICP to guarantee no more
promotion in sample loader pass will happen for the indirect call, because
it has been promoted enough.

With this change, now we can remove PromotedInsns without problem.

Differential Revision: https://reviews.llvm.org/D97350

3 years ago[libcxx] adds concepts std::equality_comparable[_with]
Christopher Di Bella [Fri, 5 Mar 2021 01:18:23 +0000 (17:18 -0800)]
[libcxx] adds concepts std::equality_comparable[_with]

Implements parts of:
    - P0898R3 Standard Library Concepts
    - P1754 Rename concepts to standard_case for C++20, while we still can

Depends on D96660

Reviewed By: ldionne, #libc, Quuxplusone

Differential Revision: https://reviews.llvm.org/D97176

3 years ago[XCOFF][DebugInfo] support DWARF for XCOFF for assembly output.
Chen Zheng [Fri, 5 Mar 2021 01:47:41 +0000 (20:47 -0500)]
[XCOFF][DebugInfo] support DWARF for XCOFF for assembly output.

Reviewed By: jasonliu

Differential Revision: https://reviews.llvm.org/D95518

3 years ago[dfsan] Remove hardcoded shadow width in array.ll
George Balatsouras [Thu, 4 Mar 2021 23:42:25 +0000 (15:42 -0800)]
[dfsan] Remove hardcoded shadow width in array.ll

As a preparation step for fast8 support, we need to update the tests
to pass in both modes. That requires generalizing the shadow width
and remove any hard coded references that assume it's always 2 bytes.

Reviewed By: stephan.yichao.zhao

Differential Revision: https://reviews.llvm.org/D97988

3 years agoBPF: permit type modifiers for __builtin_btf_type_id() relocation
Yonghong Song [Thu, 4 Mar 2021 20:58:22 +0000 (12:58 -0800)]
BPF: permit type modifiers for __builtin_btf_type_id() relocation

Lorenz Bauer from Cloudflare tried to use "const struct <name>"
as the type for __builtin_btf_type_id(*(const struct <name>)0, 1)
relocation and hit a llvm BPF fatal error.
   https://lore.kernel.org/bpf/a3782f71-3f6b-1e75-17a9-1827822c2030@fb.com/

   ...
   fatal error: error in backend: Empty type name for BTF_TYPE_ID_REMOTE reloc

Currently, we require the debuginfo type itself must have a name.
In this case, the debuginfo type is "const" which points to "struct <name>".
The "const" type does not have a name, hence the above fatal error
will be triggered.

Let us permit "const" and "volatile" type modifiers. We skip modifiers
in some other cases as well like structure member type tracing.
This can aviod the above fatal error.

Differential Revision: https://reviews.llvm.org/D97986

3 years agoFix clang for header move in LLVM/IR
David Blaikie [Fri, 5 Mar 2021 00:20:44 +0000 (16:20 -0800)]
Fix clang for header move in LLVM/IR

3 years agoMove llvm/Analysis/ObjCARCUtil.h to IR to fix layering.
David Blaikie [Fri, 5 Mar 2021 00:14:53 +0000 (16:14 -0800)]
Move llvm/Analysis/ObjCARCUtil.h to IR to fix layering.

This is included from IR files, and IR doesn't/can't depend on Analysis
(because Analysis depends on IR).

Also fix the implementation - don't use non-member static in headers, as
it leads to ODR violations, inaccurate "unused function" warnings, etc.
And fix the header protection macro name (we don't generally include
"LIB" in the names, so far as I can tell).

3 years ago[gn build] port b973e2e2f27e
Nico Weber [Thu, 4 Mar 2021 23:40:52 +0000 (18:40 -0500)]
[gn build] port b973e2e2f27e

3 years ago[dfsan] Propagate origin tracking at store
Jianzhou Zhao [Tue, 2 Mar 2021 18:59:07 +0000 (18:59 +0000)]
[dfsan] Propagate origin tracking at store

This is a part of https://reviews.llvm.org/D95835.

Reviewed By: morehouse, gbalats

Differential Revision: https://reviews.llvm.org/D97789

3 years ago[docs] Remove some stale wording from gc.relocate description
Philip Reames [Thu, 4 Mar 2021 23:18:11 +0000 (15:18 -0800)]
[docs] Remove some stale wording from gc.relocate description

We dropped support for the non-bundle form a while back, but I apparently missed updating one place in the docs.

3 years ago[docs] Move statepoint related intrinsics into main LangRef
Philip Reames [Thu, 4 Mar 2021 23:12:36 +0000 (15:12 -0800)]
[docs] Move statepoint related intrinsics into main LangRef

3 years ago[AArch64][GlobalISel][RegBankSelect] Improve rbs of G_BUILD_VECTOR when fed by fp...
Amara Emerson [Thu, 4 Mar 2021 18:18:31 +0000 (10:18 -0800)]
[AArch64][GlobalISel][RegBankSelect] Improve rbs of G_BUILD_VECTOR when fed by fp values.

This is actually two changes. One is to avoid copies when fp values are fed into
a build_vector, without being able to tell from the opcode.

The other is that build_vectors are also marked as only defining FP, since they
produce vector results.

Differential Revision: https://reviews.llvm.org/D97968

3 years ago[WebAssembly] Fix ExceptionInfo grouping again
Heejin Ahn [Thu, 4 Mar 2021 10:14:23 +0000 (02:14 -0800)]
[WebAssembly] Fix ExceptionInfo grouping again

This is a case D97677 missed. When taking out remaining BBs that are
reachable from already-taken-out exceptions (because they are not
subexcptions but unwind destinations), I assumed the remaining BBs are
not EH pads, but they can be. For example,
```
try {
  try {
    throw 0;
  } catch (int) { // (a)
  }
} catch (int) {   // (b)
}
try {
  foo();
} catch (int) {   // (c)
}
```
In this code, (b) is the unwind destination of (a) so its exception is
taken out of (a)'s exception, But even though the next try-catch is not
inside the first two-level try-catches, because the first try always
throws, its continuation BB is unreachable and the whole rest of the
function is dominated by EH pad (a), including EH pad (c). So after we
take out of (b)'s exception out of (a)'s, we also need to take out (c)'s
exception out of (a)'s, because (c) is reachable from (b).

This adds one more step before what we did for remaining BBs in D97677;
it traverses EH pads first to take subexceptions out of their incorrect
parent exception. It's the same thing as D97677, but because we can do
this before we add BBs to exceptions' sets, we don't need to fix sets
and only need to fix parent exception pointers.

Other changes are variable name changes (I changed `WE` -> `SrcWE`,
`UnwindWE` -> `DstWE` for clarity), some comment changes, and a drive-by
fix in a bug in a `LLVM_DEBUG` print statement.

Fixes https://github.com/emscripten-core/emscripten/issues/13588.

Reviewed By: dschuff

Differential Revision: https://reviews.llvm.org/D97929

3 years ago[gn build] Port 561abd83ffec
LLVM GN Syncbot [Thu, 4 Mar 2021 22:58:35 +0000 (22:58 +0000)]
[gn build] Port 561abd83ffec

3 years ago[WebAssembly] Disable uses of __clang_call_terminate
Heejin Ahn [Tue, 2 Mar 2021 23:05:30 +0000 (15:05 -0800)]
[WebAssembly] Disable uses of __clang_call_terminate

Background:

Wasm EH, while using Windows EH (catchpad/cleanuppad based) IR, uses
Itanium-based libraries and ABIs with some modifications.

`__clang_call_terminate` is a wrapper generated in Clang's Itanium C++
ABI implementation. It contains this code, in C-style pseudocode:
```
void __clang_call_terminate(void *exn) {
  __cxa_begin_catch(exn);
  std::terminate();
}
```
So this function is a wrapper to call `__cxa_begin_catch` on the
exception pointer before termination.

In Itanium ABI, this function is called when another exception is thrown
while processing an exception. The pointer for this second, violating
exception is passed as the argument of this `__clang_call_terminate`,
which calls `__cxa_begin_catch` with that pointer and calls
`std::terminate` to terminate the program.

The spec (https://libcxxabi.llvm.org/spec.html) for `__cxa_begin_catch`
says,
```
When the personality routine encounters a termination condition, it
will call __cxa_begin_catch() to mark the exception as handled and then
call terminate(), which shall not return to its caller.
```

In wasm EH's Clang implementation, this function is called from
cleanuppads that terminates the program, which we also call terminate
pads. Cleanuppads normally don't access the thrown exception and the
wasm backend converts them to `catch_all` blocks. But because we need
the exception pointer in this cleanuppad, we generate
`wasm.get.exception` intrinsic (which will eventually be lowered to
`catch` instruction) as we do in the catchpads. But because terminate
pads are cleanup pads and should run even when a foreign exception is
thrown, so what we have been doing is:
1. In `WebAssemblyLateEHPrepare::ensureSingleBBTermPads()`, we make sure
terminate pads are in this simple shape:
```
%exn = catch
call @__clang_call_terminate(%exn)
unreachable
```
2. In `WebAssemblyHandleEHTerminatePads` pass at the end of the
pipeline, we attach a `catch_all` to terminate pads, so they will be in
this form:
```
%exn = catch
call @__clang_call_terminate(%exn)
unreachable
catch_all
call @std::terminate()
unreachable
```
In `catch_all` part, we don't have the exception pointer, so we call
`std::terminate()` directly. The reason we ran HandleEHTerminatePads at
the end of the pipeline, separate from LateEHPrepare, was it was
convenient to assume there was only a single `catch` part per `try`
during CFGSort and CFGStackify.

---

Problem:

While it thinks terminate pads could have been possibly split or calls
to `__clang_call_terminate` could have been duplicated,
`WebAssemblyLateEHPrepare::ensureSingleBBTermPads()` assumes terminate
pads contain no more than calls to `__clang_call_terminate` and
`unreachable` instruction. I assumed that because in LLVM very limited
forms of transformations are done to catchpads and cleanuppads to
maintain the scoping structure. But it turned out to be incorrect;
passes can merge cleanuppads into one, including terminate pads, as long
as the new code has a correct scoping structure. One pass that does this
I observed was `SimplifyCFG`, but there can be more. After this
transformation, a single cleanuppad can contain any number of other
instructions with the call to `__clang_call_terminate` and can span many
BBs. It wouldn't be practical to duplicate all these BBs within the
cleanuppad to generate the equivalent `catch_all` blocks, only with
calls to `__clang_call_terminate` replaced by calls to `std::terminate`.

Unless we do more complicated transformation to split those calls to
`__clang_call_terminate` into a separate cleanuppad, it is tricky to
solve.

---

Solution (?):

This CL just disables the generation and use of `__clang_call_terminate`
and calls `std::terminate()` directly in its place.

The possible downside of this approach can be, because the Itanium ABI
intended to "mark" the violating exception handled, we don't do that
anymore. What `__cxa_begin_catch` actually does is increment the
exception's handler count and decrement the uncaught exception count,
which in my opinion do not matter much given that we are about to
terminate the program anyway. Also it does not affect info like stack
traces that can be possibly shown to developers.

And while we use a variant of Itanium EH ABI, we can make some
deviations if we choose to; we are already different in that in the
current version of the EH spec we don't support two-phase unwinding. We
can possibly consider a more complicated transformation later to
reenable this, but I don't think that has high priority.

Changes in this CL contains:
- In Clang, we don't generate a call to `wasm.get.exception()` intrinsic
  and `__clang_call_terminate` function in terminate pads anymore; we
  simply generate calls to `std::terminate()`, which is the default
  implementation of `CGCXXABI::emitTerminateForUnexpectedException`.
- Remove `WebAssembly::ensureSingleBBTermPads() function and
  `WebAssemblyHandleEHTerminatePads` pass, because terminate pads are
  already `catch_all` now (because they don't need the exception
  pointer) and we don't need these transformations anymore.
- Change tests to use `std::terminate` directly. Also removes tests that
  tested `LateEHPrepare::ensureSingleBBTermPads` and
  `HandleEHTerminatePads` pass.
- Drive-by fix: Add some function attributes to EH intrinsic
  declarations

Fixes https://github.com/emscripten-core/emscripten/issues/13582.

Reviewed By: dschuff, tlively

Differential Revision: https://reviews.llvm.org/D97834

3 years agoRevert "[Attributor] Enable heap-to-stack of any size"
William S. Moses [Thu, 4 Mar 2021 22:24:24 +0000 (17:24 -0500)]
Revert "[Attributor] Enable heap-to-stack of any size"

This reverts commit 51bd42ef9b870787afbeeffcd33adce765f70f23.

3 years ago[LoopVectorize] propagate fast-math-flags from induction instructions
Sanjay Patel [Thu, 4 Mar 2021 21:27:51 +0000 (16:27 -0500)]
[LoopVectorize] propagate fast-math-flags from induction instructions

This code assumed that FP math was only permissable if it was
fully "fast", so it hard-coded "fast" when creating new instructions.

The underlying code already allows matching recurrences/reductions
that are only "reassoc", so this change should prevent the potential
miscompile seen in the test diffs (we created "fast" ops even though
none existed in the original code).

I don't know if we need to create the temporary IRBuilder objects
used here, so that could be follow-up clean-up.

There's an open question about whether we should require "nsz" in
addition to "reassoc" here. InstCombine uses that combo for its
reassociative folds, but I think codegen is not as strict.

3 years ago[Attributor] Enable heap-to-stack of any size
William S. Moses [Tue, 2 Mar 2021 19:41:43 +0000 (14:41 -0500)]
[Attributor] Enable heap-to-stack of any size

Enable Attributor's heap-to-stack to lower unbounded allocations given a max size of -1

Differential Revision: https://reviews.llvm.org/D97873

3 years ago[MS] Fix crash involving gnu stmt exprs and inalloca
Reid Kleckner [Thu, 4 Mar 2021 21:52:30 +0000 (13:52 -0800)]
[MS] Fix crash involving gnu stmt exprs and inalloca

Use a WeakTrackingVH to cope with the stmt emission logic that cleans up
unreachable blocks. This invalidates the reference to the deferred
replacement placeholder. Cope with it.

Fixes PR25102 (from 2015!)

3 years ago[NFC][AliasSetTracker] Remove implicit conversion AliasResult to integer.
dfukalov [Thu, 4 Mar 2021 20:17:49 +0000 (23:17 +0300)]
[NFC][AliasSetTracker] Remove implicit conversion AliasResult to integer.

Preparation to make AliasResult scoped enumeration.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D97973