platform/upstream/llvm.git
4 years ago[LV][ARM] Add preferInloopReduction target hook.
David Green [Sat, 12 Sep 2020 16:47:04 +0000 (17:47 +0100)]
[LV][ARM] Add preferInloopReduction target hook.

This allows the backend to tell the vectorizer to produce inloop
reductions through a TTI hook.

For the moment on ARM under MVE this means allowing integer add
reductions of the correct size. In the future this can include integer
min/max too, under -Os.

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

4 years agoTableGen: change a couple of member names to clarify their use.
Paul C. Anagnostopoulos [Sat, 12 Sep 2020 15:50:01 +0000 (11:50 -0400)]
TableGen: change a couple of member names to clarify their use.

4 years ago[InstCombine][X86] Covert masked load/stores with (sign extended) bool vector masks...
Simon Pilgrim [Sat, 12 Sep 2020 14:02:30 +0000 (15:02 +0100)]
[InstCombine][X86] Covert masked load/stores with (sign extended) bool vector masks to generic intrinsics.

As detailed on PR11210, if the mask is known to come from a (sign extended) bool vector (e.g. comparisons) then we can represent with a generic masked load/store without losing anything.

We already do something similar for BLENDV -> SELECT conversion.

4 years ago[Clang] Add option to allow marking pass-by-value args as noalias.
Florian Hahn [Sat, 12 Sep 2020 13:23:36 +0000 (14:23 +0100)]
[Clang] Add option to allow marking pass-by-value args as noalias.

After the recent discussion on cfe-dev 'Can indirect class parameters be
noalias?' [1], it seems like using using noalias is problematic for
current C++, but should be allowed for C-only code.

This patch introduces a new option to let the user indicate that it is
safe to mark indirect class parameters as noalias. Note that this also
applies to external callers, e.g. it might not be safe to use this flag
for C functions that are called by C++ functions.

In targets that allocate indirect arguments in the called function, this
enables more agressive optimizations with respect to memory operations
and brings a ~1% - 2% codesize reduction for some programs.

[1] : http://lists.llvm.org/pipermail/cfe-dev/2020-July/066353.html

Reviewed By: rjmccall

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

4 years ago[MachineScheduler] Fix operand scheduling for pre/post-increment loads
Evgeny Leviant [Sat, 12 Sep 2020 13:53:12 +0000 (16:53 +0300)]
[MachineScheduler] Fix operand scheduling for pre/post-increment loads

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

4 years agoReland [AssumeBundles] Use operand bundles to encode alignment assumptions
Tyker [Sat, 12 Sep 2020 11:36:45 +0000 (13:36 +0200)]
Reland [AssumeBundles] Use operand bundles to encode alignment assumptions

NOTE: There is a mailing list discussion on this: http://lists.llvm.org/pipermail/llvm-dev/2019-December/137632.html

Complemantary to the assumption outliner prototype in D71692, this patch
shows how we could simplify the code emitted for an alignemnt
assumption. The generated code is smaller, less fragile, and it makes it
easier to recognize the additional use as a "assumption use".

As mentioned in D71692 and on the mailing list, we could adopt this
scheme, and similar schemes for other patterns, without adopting the
assumption outlining.

4 years ago[InstCombine][X86] Add tests for masked load/stores with comparisons.
Simon Pilgrim [Sat, 12 Sep 2020 13:31:26 +0000 (14:31 +0100)]
[InstCombine][X86] Add tests for masked load/stores with comparisons.

As detailed on PR11210, if the mask is known to come from a (sign extended) bool vector (e.g. comparisons) then we can represent with a generic masked load/store without losing anything.

4 years ago[ARM] Fixup single source mla reductions.
David Green [Sat, 12 Sep 2020 13:31:26 +0000 (14:31 +0100)]
[ARM] Fixup single source mla reductions.

This fixes a complication on top of D87276. If we are sign extending
around a mul with the two operands that are the same, instcombine will
helpfully convert one of the sext to a zext. Reverse that so that we
again generate a reduction.

Differnetial Revision: https://reviews.llvm.org/D87287

4 years ago[Intrinsics] define semantics for experimental fmax/fmin vector reductions
Sanjay Patel [Sat, 12 Sep 2020 13:08:07 +0000 (09:08 -0400)]
[Intrinsics] define semantics for experimental fmax/fmin vector reductions

As discussed on llvm-dev:
http://lists.llvm.org/pipermail/llvm-dev/2020-April/140729.html

This is hopefully the final remaining showstopper before we can remove
the 'experimental' from the reduction intrinsics.

No behavior was specified for the FP min/max reductions, so we have a
mess of different interpretations.

There are a few potential options for the semantics of these max/min ops.
I think this is the simplest based on current behavior/implementation:
make the reductions inherit from the existing llvm.maxnum/minnum intrinsics.
These correspond to libm fmax/fmin, and those are similar to the (now
deprecated?) IEEE-754 maxNum/minNum functions (NaNs are treated as missing
data). So the default expansion creates calls to libm functions.

Another option would be to inherit from llvm.maximum/minimum (NaNs propagate),
but most targets just crash in codegen when given those nodes because no
default expansion was ever implemented AFAICT.

We could also just assume 'nnan' semantics by default (we are already
assuming 'nsz' semantics in the maxnum/minnum intrinsics), but some targets
(AArch64, PowerPC) support the more defined behavior, so it doesn't make much
sense to not allow a tighter spec. Fast-math-flags (nnan) can be used to
loosen the semantics.

(Note that D67507 was proposed to update the LangRef to acknowledge the more
recent IEEE-754 2019 standard, but that patch seems to have stalled. If we do
update based on the new standard, the reduction instructions can seamlessly
inherit from whatever updates are made to the max/min intrinsics.)

x86 sees a regression here on 'nnan' tests because we have underlying,
longstanding bugs in FMF creation/propagation. Those need to be fixed apart
from this change (for example: https://llvm.org/PR35538). The expansion
sequence before this patch may not have been correct.

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

4 years ago[InstCombine][X86] getNegativeIsTrueBoolVec - use ConstantExpr evaluators. NFCI.
Simon Pilgrim [Sat, 12 Sep 2020 12:51:25 +0000 (13:51 +0100)]
[InstCombine][X86] getNegativeIsTrueBoolVec - use ConstantExpr evaluators. NFCI.

Don't do this manually, we can just use the ConstantExpr evaluators to do it more tidily for us.

4 years ago[ARM] Recognize "double extend" reduction patterns
David Green [Sat, 12 Sep 2020 12:51:42 +0000 (13:51 +0100)]
[ARM] Recognize "double extend" reduction patterns

We can sometimes get code that does:
  xe = zext i16 x to i32
  ye = zext i16 y to i32
  m = mul i32 xe, ye
  me = zext i32 m to i64
  r = vecreduce.add(me)
This "double extend" can trip up the reduction identification, but
should give identical results.

This extends the pattern matching to handle them.

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

4 years ago[InstCombine] Fix incorrect SimplifyWithOpReplaced transform (PR47322)
Nikita Popov [Thu, 10 Sep 2020 10:19:16 +0000 (12:19 +0200)]
[InstCombine] Fix incorrect SimplifyWithOpReplaced transform (PR47322)

This is a followup to D86834, which partially fixed this issue in
InstSimplify. However, InstCombine repeats the same transform while
dropping poison flags -- which does not cover cases where poison is
introduced in some other way.

The fix here is a bit more comprehensive, because things are quite
entangled, and it's hard to only partially address it without
regressing optimization. There are really two changes here:

 * Export the SimplifyWithOpReplaced API from InstSimplify, with an
   added AllowRefinement flag. For replacements inside the TrueVal
   we don't actually care whether refinement occurs or not, the
   replacement is always legal. This part of the transform is now
   done in InstSimplify only. (It should be noted that the current
   AllowRefinement check is not sufficient -- that's an issue we
   need to address separately.)
 * Change the InstCombine fold to work by temporarily dropping
   poison generating flags, running the fold and then restoring the
   flags if it didn't work out. This will ensure that the InstCombine
   fold is correct as long as the InstSimplify fold is correct.

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

4 years ago[X86][SSE] lowerShuffleAsDecomposedShuffleBlend - support decomposed unpacks for...
Simon Pilgrim [Sat, 12 Sep 2020 12:39:33 +0000 (13:39 +0100)]
[X86][SSE] lowerShuffleAsDecomposedShuffleBlend - support decomposed unpacks for some vXi8/vXi16 cases

Follow up to D86429 to handle the remaining regressions.

This patch generalizes lowerShuffleAsDecomposedShuffleBlend to lowerShuffleAsDecomposedShuffleMerge, and attempts to use an UNPCKL shuffle mask instead of a blend for the cases where the inputs are coming from alternating vXi8/vXi16 sources. Technically they don't have to be alternating (just as long as they can fit into a lower lane half for the unpack) but I didn't find as many general cases and it needed a lot more of the function to be altered.

For vXi32/vXi64 cases this could still be beneficial but in most cases the existing permute+blend approach was better.

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

4 years ago[gn build] Port 19531a81f1d
LLVM GN Syncbot [Sat, 12 Sep 2020 10:08:18 +0000 (10:08 +0000)]
[gn build] Port 19531a81f1d

4 years agoRevert "[AST][FPEnv] Keep FP options in trailing storage of CastExpr"
Serge Pavlov [Sat, 12 Sep 2020 10:05:26 +0000 (17:05 +0700)]
Revert "[AST][FPEnv] Keep FP options in trailing storage of CastExpr"

This reverts commit 6c8041aa0ffed827636935e59c489b1e390c8542.
It caused some fails on buildbots.

4 years agoAdd a header file to support ssize_t for windows
Jianzhou Zhao [Sat, 12 Sep 2020 08:49:22 +0000 (08:49 +0000)]
Add a header file to support ssize_t for windows

fixing
https://github.com/llvm/llvm-project/commit/0ece51c60c51f0d4c285dbda3b6cff794041bdd7

4 years agoMissing change from previous commit
Serge Pavlov [Sat, 12 Sep 2020 08:10:09 +0000 (15:10 +0700)]
Missing change from previous commit

4 years agoAdd raw_fd_stream_test.cpp into CMakeLists.txt
Jianzhou Zhao [Sat, 12 Sep 2020 07:48:12 +0000 (07:48 +0000)]
Add raw_fd_stream_test.cpp into CMakeLists.txt

Fixing https://github.com/llvm/llvm-project/commit/0ece51c60c51f0d4c285dbda3b6cff794041bdd7

4 years agoAdd raw_fd_stream that supports reading/seeking/writing
Jianzhou Zhao [Tue, 1 Sep 2020 07:16:07 +0000 (07:16 +0000)]
Add raw_fd_stream that supports reading/seeking/writing

This is used by https://reviews.llvm.org/D86905 to support bitcode
writer's incremental flush.

4 years ago[AST][FPEnv] Keep FP options in trailing storage of CastExpr
Serge Pavlov [Sat, 12 Sep 2020 07:30:44 +0000 (14:30 +0700)]
[AST][FPEnv] Keep FP options in trailing storage of CastExpr

This change allow a CastExpr to have optional FPOptionsOverride object,
stored in trailing storage. Of all cast nodes only ImplicitCastExpr,
CStyleCastExpr, CXXFunctionalCastExpr and CXXStaticCastExpr are allowed
to have FPOptions.

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

4 years ago[Power10] Enable the heuristic for Power10 and switch the sched model
QingShan Zhang [Sat, 12 Sep 2020 02:49:47 +0000 (02:49 +0000)]
[Power10] Enable the heuristic for Power10 and switch the sched model
with P9 Model

Enable the pre-ra and post-ra scheduler strategy for Power10 as we want
to customize the heuristic later. And switch the scheduler model with P9
model before P10 Model is available. The NoSchedModel is modelled as
in-order cpu and the pre-ra scheduler is not bi-directional which will
have big impact on the scheduler.

Reviewed By: jji

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

4 years ago[PowerPC] Set the mayRaiseFPException for FCMPUS/FCMPUD
QingShan Zhang [Sat, 12 Sep 2020 02:42:22 +0000 (02:42 +0000)]
[PowerPC] Set the mayRaiseFPException for FCMPUS/FCMPUD

From ISA, fcmpu will raise the Floating-Point Invalid Operation
Exception (SNaN) if either of the operands is a Signaling NaN by setting
the bit VXSNAN. But the instruction description didn't set the
mayRaiseFPException which might have impact on the scheduling or some
backend optimization.

Reviewed By: qiucf

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

4 years ago[gn build] Port ad99e34c59b
LLVM GN Syncbot [Sat, 12 Sep 2020 01:54:23 +0000 (01:54 +0000)]
[gn build] Port ad99e34c59b

4 years agoRevert "[NewPM][CodeGen] Introduce CodeGenPassBuilder to help build codegen pipeline"
Yuanfang Chen [Sat, 12 Sep 2020 01:51:54 +0000 (18:51 -0700)]
Revert "[NewPM][CodeGen] Introduce CodeGenPassBuilder to help build codegen pipeline"

This reverts commit 31ecf8d29d81d196374a562c6d2bd2c25a62861e.
This reverts commit 3fdaa8602a086a3fca5f0fc8527536ac659079d0.

There is laying violation for Target->CodeGen.

4 years ago[gn] Remove unneeded MC dep from llvm-tblgen
Reid Kleckner [Sat, 12 Sep 2020 00:43:49 +0000 (17:43 -0700)]
[gn] Remove unneeded MC dep from llvm-tblgen

Tablegen does not have link time dependencies on MC. Having llvm-tblgen
depend on it causes it to be rebuilt in the gn build every time somebody
touches any cpp file in llvm/lib/MC* or llvm/lib/DebugInfo/Codeview*.
Touching tablegen invalidates most of the rest of the build, and
re-running it takes a while. This is is annoying for me when swapping
between branches that touch CodeView logic.

This dep was added to LLVMBuild.txt back in 2018, and presumably it was
carried over into the gn build.

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

4 years agoFix a couple of tests that relied on the clang binary having 'clang' somewhere in...
David Blaikie [Sat, 12 Sep 2020 00:44:49 +0000 (17:44 -0700)]
Fix a couple of tests that relied on the clang binary having 'clang' somewhere in the name

Because why would that be necessary? (I joke - I hadn't actually
expected this to be an issue but a content-hash-named filesystem means
the clang binary's just a bunch of numbers, and doesn't have 'clang'
anywhere in the name)

4 years ago[lldb] Use GetNonKVOClassDescriptor to get the NSDictionary class descriptor
Jonas Devlieghere [Fri, 11 Sep 2020 20:25:40 +0000 (13:25 -0700)]
[lldb] Use GetNonKVOClassDescriptor to get the NSDictionary class descriptor

On macOS Big Sur the class descriptor contains the NSKVONotifying_
prefix. This is covered by TestDataFormatterObjCKVO.

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

4 years ago[ConstantFold] Make areGlobalsPotentiallyEqual less aggressive.
Eli Friedman [Fri, 4 Sep 2020 03:58:56 +0000 (20:58 -0700)]
[ConstantFold] Make areGlobalsPotentiallyEqual less aggressive.

In particular, we shouldn't make assumptions about globals which are
unnamed_addr: we can fold them together with other globals.

Also while I'm here, use isInterposable() instead of trying to
explicitly name all the different kinds of weak linkage.

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

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

4 years ago[gn build] Port 31ecf8d29d8
LLVM GN Syncbot [Fri, 11 Sep 2020 23:54:25 +0000 (23:54 +0000)]
[gn build] Port 31ecf8d29d8

4 years agoFix a typo in 31ecf8d29d81d196374a562c6d2bd2c25a62861e
Yuanfang Chen [Fri, 11 Sep 2020 23:50:36 +0000 (16:50 -0700)]
Fix a typo in 31ecf8d29d81d196374a562c6d2bd2c25a62861e

4 years ago[NFC] Remove unused static function
Vitaly Buka [Fri, 11 Sep 2020 23:49:20 +0000 (16:49 -0700)]
[NFC] Remove unused static function

4 years ago[ConstantFold] Fold binary arithmetic on scalable vector splats.
Eli Friedman [Wed, 9 Sep 2020 22:22:38 +0000 (15:22 -0700)]
[ConstantFold] Fold binary arithmetic on scalable vector splats.

It's a nice simplification, and it confuses instcombine if we don't do
it.

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

4 years ago[NewPM][CodeGen] Introduce CodeGenPassBuilder to help build codegen pipeline
Yuanfang Chen [Fri, 11 Sep 2020 22:56:27 +0000 (15:56 -0700)]
[NewPM][CodeGen] Introduce CodeGenPassBuilder to help build codegen pipeline

Following up on D67687.
Please refer to the RFC here http://lists.llvm.org/pipermail/llvm-dev/2020-July/143309.html

`CodeGenPassBuilder` is the NPM counterpart of `TargetPassConfig` with below differences.
- Debugging features (MIR print/verify, disable pass, start/stop-before/after, etc.) living in `TargetPassConfig` are moved to use PassInstrument as much as possible. (Implementation also lives in `TargetPassConfig.cpp`)
- `TargetPassConfig` is a polymorphic base (virtual inheritance) to build the target-dependent pipeline whereas `CodeGenPassBuilder` is the CRTP base/helper to implement the target-dependent pipeline. The motivation is flexibility for targets to customize the pipeline, inlining opportunity, and fits the overall NPM value semantics design.
- `TargetPassConfig` is a legacy immutable pass to declare hooks for targets to customize some target-independent codegen layer behavior. This is partially ported to TargetMachine::options. The rest, such as `createMachineScheduler/createPostMachineScheduler`, are left out for now. They should be implemented in LLVMTargetMachine in the future.

Reviewed By: arsenm

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

4 years ago[NFC][Asan] Add another lsan test
Vitaly Buka [Fri, 11 Sep 2020 21:22:54 +0000 (14:22 -0700)]
[NFC][Asan] Add another lsan test

4 years ago[MS ABI] Add mangled type for auto template parameter whose argument kind is Integeral
Zequan Wu [Fri, 11 Sep 2020 00:45:16 +0000 (17:45 -0700)]
[MS ABI] Add mangled type for auto template parameter whose argument kind is Integeral

4 years ago[lldb] Add test for CFMutableDictionaryRef
Jonas Devlieghere [Fri, 11 Sep 2020 21:33:55 +0000 (14:33 -0700)]
[lldb] Add test for CFMutableDictionaryRef

While writing a test for a change in Foundation I noticed we didn't yet
test CFMutableDictionaryRef.

4 years agoFix clang Wrange-loop-analysis in BuildTree.cpp
Dmitri Gribenko [Fri, 11 Sep 2020 23:07:54 +0000 (01:07 +0200)]
Fix clang Wrange-loop-analysis in BuildTree.cpp

Building on Mac OS with clang 12:

```
jhemphill@jhemphill-mbp build % clang --version
Apple clang version 12.0.0 (clang-1200.0.26.2)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

yields one warning:

```
/Users/jhemphill/oss/llvm-project/clang/lib/Tooling/Syntax/BuildTree.cpp:1126:22: warning: loop variable 'Arg' is always a copy because the range of type 'llvm::iterator_range<clang::Stmt::CastIterator<clang::Expr, clang::Expr *, clang::Stmt *> >' does not return a reference [-Wrange-loop-analysis]
    for (const auto &Arg : Args) {
                     ^
/Users/jhemphill/oss/llvm-project/clang/lib/Tooling/Syntax/BuildTree.cpp:1126:10: note: use non-reference type 'clang::Expr *'
    for (const auto &Arg : Args) {
```

It appears that `Arg` is an `Expr*`, passed by value rather than by const reference.

Reviewed By: eduucaldas, gribozavr2

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

4 years ago[NFC][Asan] Early return from GetBlockBegin
Vitaly Buka [Fri, 11 Sep 2020 20:45:07 +0000 (13:45 -0700)]
[NFC][Asan] Early return from GetBlockBegin

4 years ago[MC] Allow .org directives in SHT_NOBITS sections
Fangrui Song [Fri, 11 Sep 2020 22:12:15 +0000 (15:12 -0700)]
[MC] Allow .org directives in SHT_NOBITS sections

This is used by kvm-unit-tests and can be trivially supported.

4 years agodocs: add a newline to appease Sphinx
Saleem Abdulrasool [Fri, 11 Sep 2020 22:08:38 +0000 (22:08 +0000)]
docs: add a newline to appease Sphinx

Sphinx expects an empty newline after the bulleted list.

4 years agoRegAllocFast: Fix typo in comment
Matt Arsenault [Tue, 25 Aug 2020 20:07:35 +0000 (16:07 -0400)]
RegAllocFast: Fix typo in comment

4 years agoCodeGen: Require SSA to run PeepholeOptimizer
Matt Arsenault [Fri, 28 Aug 2020 23:51:33 +0000 (19:51 -0400)]
CodeGen: Require SSA to run PeepholeOptimizer

4 years agoFix test hip-gz-options.hip
Yaxun (Sam) Liu [Fri, 11 Sep 2020 21:56:28 +0000 (17:56 -0400)]
Fix test hip-gz-options.hip

4 years ago[lld][WebAssembly] Convert a objyaml-using test to assembly
Sam Clegg [Fri, 11 Sep 2020 18:22:31 +0000 (11:22 -0700)]
[lld][WebAssembly] Convert a objyaml-using test to assembly

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

4 years agoSema: add support for `__attribute__((__swift_error__))`
Saleem Abdulrasool [Tue, 8 Sep 2020 21:19:43 +0000 (21:19 +0000)]
Sema: add support for `__attribute__((__swift_error__))`

Introduce a new attribute that is used to indicate the error handling
convention used by a function.  This is used to translate the error
semantics from the decorated interface to a compatible Swift interface.

The supported error convention is one of:
- none: no error handling
- nonnull_error: a non-null error parameter indicates an error signifier
- null_result: a return value of NULL is an error signifier
- zero_result: a return value of 0 is an error signifier
- nonzero_result: a non-zero return value is an error signifier

Since this is the first of the attributes needed to support the semantic
annotation for Swift, this change also includes the necessary supporting
infrastructure for a new category of attributes (Swift).

This is based on the work of the original changes in
https://github.com/llvm/llvm-project-staging/commit/8afaf3aad2af43cfedca7a24cd817848c4e95c0c

Differential Revision: https://reviews.llvm.org/D87331
Reviewed By: John McCall, Aaron Ballman, Dmitri Gribenko

4 years agoFix -gz=zlib options for linker
Yaxun (Sam) Liu [Tue, 8 Sep 2020 17:45:45 +0000 (13:45 -0400)]
Fix -gz=zlib options for linker

gcc translates -gz=zlib to --compress-debug-options=zlib for both assembler and linker
but clang only does this for assembler.

The linker needs --compress-debug-options=zlib option to compress the debug sections
in the generated executable or shared library.

Due to this bug, -gz=zlib has no effect on the generated executable or shared library.

This patch fixes that.

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

4 years agoRe-apply "[ORC] Make MaterializationResponsibility immovable..." with fixes.
Lang Hames [Fri, 11 Sep 2020 16:23:14 +0000 (09:23 -0700)]
Re-apply "[ORC] Make MaterializationResponsibility immovable..." with fixes.

Re-applies c74900ca672 with fixes for the ThinLtoJIT example.

4 years ago[SyntaxTree][Synthesis] Add support for Tree.
Eduardo Caldas [Fri, 11 Sep 2020 15:59:22 +0000 (15:59 +0000)]
[SyntaxTree][Synthesis] Add support for Tree.

In a future patch
* Implement helper function to generate Trees for tests
* and test Tree methods, namely `findFirstLeaf` and `findLastLeaf`

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

4 years ago[Coroutine][Sema] Tighten the lifetime of symmetric transfer returned handle
Xun Li [Fri, 11 Sep 2020 20:34:03 +0000 (13:34 -0700)]
[Coroutine][Sema] Tighten the lifetime of symmetric transfer returned handle

In generating the code for symmetric transfer, a temporary object is created to store the returned handle from await_suspend() call of the awaiter. Previously this temp won't be cleaned up until very later, which ends up causing this temp to be spilled to the heap. However, we know that this temp will no longer be needed after the coro_resume call. We can clean it up right after.

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

4 years ago[ThinLTO] Make -lto-embed-bitcode an enum
Mircea Trofin [Thu, 10 Sep 2020 19:16:26 +0000 (12:16 -0700)]
[ThinLTO] Make -lto-embed-bitcode an enum

The current behavior of -lto-embed-bitcode is not quite the same as that
of -fembed-bitcode. While both populate .llvmbc with bitcode, the latter
populates it with pre-optimized bitcode(*), while the former with
post-optimized. The scenarios driving them are different - the latter's
goal is to allow re-compilation, while the former, IIUC, is execution.

I plan to add a third mode for thinlto cases, closely-related to
-fembed-bitcode's scenario: adding the bitcode pre-optimization, but
post-merging. This would allow re-compilation without requiring the
other .bc files that were merged (akin to how -fembed-bitcode allows
recompilation without all the .h files)

The third mode can't co-exist with the current -lto-embed-bitcode mode,
because the latter would overwrite it. For clarity, we change
-lto-embed-bitcode to be an enum.

(*) That's the compiler semantics. The driver splits compilation in 2
phases, so if -fembed-bitcode is given to the driver, the .llvmbc is
optimized bitcode; if the option is passed to the compiler (after -cc1),
the section is pre-optimized.

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

4 years agoRe-split integral & pointer overloads. Add tests.
Olivier Giroux [Fri, 11 Sep 2020 19:13:35 +0000 (12:13 -0700)]
Re-split integral & pointer overloads. Add tests.

4 years ago[flang] Fix bug for forward referenced type
Peter Steinfeld [Fri, 11 Sep 2020 18:02:04 +0000 (11:02 -0700)]
[flang] Fix bug for forward referenced type

A type name in an IMPLICIT declaration that was later used in a PARAMETER
statement caused problems because the default symbol scope had not yet been
initialized.  I avoided dereferencing in the situation where the default scope
was uninitialized and added a test that triggers the problem.

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

4 years ago[SyntaxTree] Add const qualifiers, from [llvm-qualified-auto]
Eduardo Caldas [Fri, 11 Sep 2020 16:33:18 +0000 (16:33 +0000)]
[SyntaxTree] Add const qualifiers, from [llvm-qualified-auto]

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

4 years ago[SyntaxTree] Reduce visibility of `Arena::lexBuffer`.
Eduardo Caldas [Fri, 11 Sep 2020 13:13:19 +0000 (13:13 +0000)]
[SyntaxTree] Reduce visibility of `Arena::lexBuffer`.

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

4 years ago[SyntaxTree][Synthesis] Add support for simple Leafs and test based on tree dump
Eduardo Caldas [Thu, 10 Sep 2020 17:54:54 +0000 (17:54 +0000)]
[SyntaxTree][Synthesis] Add support for simple Leafs and test based on tree dump

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

4 years ago[CMake][OpenMP] Simplify getting CUDA library directory
Raul Tambre [Sat, 5 Sep 2020 15:27:04 +0000 (18:27 +0300)]
[CMake][OpenMP] Simplify getting CUDA library directory

LLVM now requires CMake 3.13.4 so we can simplify this.

Reviewed By: phosek

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

4 years ago[WebAssembly] Add assembly syntax for mutable globals
Sam Clegg [Fri, 11 Sep 2020 14:20:40 +0000 (07:20 -0700)]
[WebAssembly] Add assembly syntax for mutable globals

This adds and optional ", immutable" to the end of a `.globaltype`
declaration.  I would have prefered to match the `.wat` syntax
where immutable is the default and `mut` is the signifier for
mutable globals.  Sadly changing the default would break backwards
compat with existing assembly in the wild so I think its best
to stick with this approach.

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

4 years ago[lldb/API] Add Breakpoint::SerializeToStructuredData to SBAPI
Med Ismail Bennani [Fri, 11 Sep 2020 18:09:44 +0000 (20:09 +0200)]
[lldb/API] Add Breakpoint::SerializeToStructuredData to SBAPI

This patch adds a way to fetch breakpoint metadatas as a serialized
`Structured` Data format (JSON). This can be used by IDEs to update
their UI when a breakpoint is set or modified from the console.

rdar://11013798

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

Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
4 years ago[mlir] Fix some edge cases around 0-element TensorFromElementsOp
Sean Silva [Fri, 11 Sep 2020 05:04:58 +0000 (22:04 -0700)]
[mlir] Fix some edge cases around 0-element TensorFromElementsOp

This introduces a builder for the more general case that supports zero
elements (where the element type can't be inferred from the ValueRange,
since it might be empty).

Also, fix up some cases in ShapeToStandard lowering that hit this. It
happens very easily when dealing with shapes of 0-D tensors.

The SameOperandsAndResultElementType is redundant with the new
TypesMatchWith and prevented having zero elements.

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

4 years ago[mlir][spirv] OpConvertSToF support operands with different bitwidth.
Xin Wang [Fri, 11 Sep 2020 17:39:00 +0000 (10:39 -0700)]
[mlir][spirv] OpConvertSToF support operands with different bitwidth.

close SameBitWidth check in verifier.

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

4 years ago[SVE] Regenerate sve vector bits tests. NFC
David Green [Fri, 11 Sep 2020 17:51:57 +0000 (18:51 +0100)]
[SVE] Regenerate sve vector bits tests. NFC

4 years ago[ARM] Extra MLA reductions tests. NFC
David Green [Fri, 11 Sep 2020 16:51:15 +0000 (17:51 +0100)]
[ARM] Extra MLA reductions tests. NFC

4 years ago[FPEnv] [Clang] Enable constrained FP support for PowerPC
Qiu Chaofan [Fri, 11 Sep 2020 16:37:36 +0000 (00:37 +0800)]
[FPEnv] [Clang] Enable constrained FP support for PowerPC

d4ce862f introduced HasStrictFP to disable generating constrained FP
operations for platforms lacking support. Since work for enabling
constrained FP on PowerPC is almost done, we'd like to enable it.

Reviewed By: kpn, steven.zhang

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

4 years agoRevert "[examples] Adjust ThinLtoInstrumentationLayer for emit signature change"
Jonas Devlieghere [Fri, 11 Sep 2020 16:22:42 +0000 (09:22 -0700)]
Revert "[examples] Adjust ThinLtoInstrumentationLayer for emit signature change"

I raced with Florian and he had already reverted the original patch.

4 years ago[ELF][PowerPC] Define NOP as 0x60000000 to tidy up code. NFC
Fangrui Song [Thu, 10 Sep 2020 21:37:11 +0000 (14:37 -0700)]
[ELF][PowerPC] Define NOP as 0x60000000 to tidy up code. NFC

Reviewed By: nemanjai

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

4 years ago[DFSan] Re-enable event_callbacks test.
Matt Morehouse [Fri, 11 Sep 2020 16:13:34 +0000 (09:13 -0700)]
[DFSan] Re-enable event_callbacks test.

Mark the dest pointers for memcpy and memmove as volatile, to avoid dead
store elimination.  Fixes https://bugs.llvm.org/show_bug.cgi?id=47488.

4 years ago[docs] Fix typos
YangZhihui [Fri, 11 Sep 2020 15:51:36 +0000 (17:51 +0200)]
[docs] Fix typos

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

4 years ago[SLP] further limit bailout for load combine candidate (PR47450)
Sanjay Patel [Fri, 11 Sep 2020 15:47:23 +0000 (11:47 -0400)]
[SLP] further limit bailout for load combine candidate (PR47450)

The test example based on PR47450 shows that we can
match non-byte-sized shifts, but those won't ever be
bswap opportunities. This isn't a full fix (we'd still
match if the shifts were by 8-bits for example), but
this should be enough until there's evidence that we
need to do more (this is a borderline case for
vectorization in the first place).

4 years ago[SLP] add test for missed store vectorization; NFC
Sanjay Patel [Fri, 11 Sep 2020 15:33:41 +0000 (11:33 -0400)]
[SLP] add test for missed store vectorization; NFC

4 years ago[libcxx] Remove the 'availability' Lit feature
Louis Dionne [Fri, 11 Sep 2020 15:05:22 +0000 (11:05 -0400)]
[libcxx] Remove the 'availability' Lit feature

Instead, use with_system_cxx_lib with various compile-only tests to ensure
that we're getting compile-time errors, as expected. This follows the
lead of ec46cfefe80d5.

4 years ago[examples] Adjust ThinLtoInstrumentationLayer for emit signature change
Jonas Devlieghere [Fri, 11 Sep 2020 15:32:55 +0000 (08:32 -0700)]
[examples] Adjust ThinLtoInstrumentationLayer for emit signature change

Emit now takes a std::unique_ptr<MaterializationResponsibility> instead
of a MaterializationResponsibility directly.

This should fix:
http://green.lab.llvm.org/green/view/LLDB/job/lldb-cmake-standalone/

4 years ago[gn build] slightly improve libcxx_needs_site_config
Nico Weber [Fri, 11 Sep 2020 15:32:17 +0000 (11:32 -0400)]
[gn build] slightly improve libcxx_needs_site_config

The write_cmake_config() here still looks busted, but at least
the value that's explicitly set is now set correctly.

4 years ago[flang] Fix build issue with BUILD_SHARED_LIBS=ON
Richard Barton [Fri, 11 Sep 2020 14:46:39 +0000 (15:46 +0100)]
[flang] Fix build issue with BUILD_SHARED_LIBS=ON

Define Fortran::Semantics::Scope::GetName in the header so it is available
to Fortran::Evaluate::Tool::AttachDeclaration without a circular dependency
introduced in 82edd42.

Reviewed By: tskeith

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

4 years ago[NFC] Follow up on D87111 - Add an option for unrolling loops up to a factor - CR...
Lubomir Litchev [Tue, 8 Sep 2020 18:50:08 +0000 (11:50 -0700)]
[NFC] Follow up on D87111 - Add an option for unrolling loops up to a factor - CR issues addressed.

Addressed some CR issues pointed out in D87111. Formatting and other nits.
The original Diff D87111 - Add an option for unrolling loops up to a factor.

Reviewed By: bondhugula

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

4 years ago[DSE] Make sure that DSE+MSSA can handle masked stores
Krzysztof Parzyszek [Wed, 9 Sep 2020 20:23:34 +0000 (15:23 -0500)]
[DSE] Make sure that DSE+MSSA can handle masked stores

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

4 years agoRevert "[InstCombine] propagate 'nsw' on pointer difference of 'inbounds' geps (PR47430)"
Sanjay Patel [Fri, 11 Sep 2020 14:51:14 +0000 (10:51 -0400)]
Revert "[InstCombine] propagate 'nsw' on pointer difference of 'inbounds' geps (PR47430)"

This reverts commit 324a53205a3af979e3de109fdd52f91781816cba.

On closer examination of at least one of the test diffs,
this does not appear to be correct in all cases. Even the
existing 'nsw' creation may be wrong based on this example:
https://alive2.llvm.org/ce/z/uL4Hw9
https://alive2.llvm.org/ce/z/fJMKQS

4 years ago[SyntaxTree] Rename functions to start with verb
Eduardo Caldas [Fri, 11 Sep 2020 08:56:10 +0000 (08:56 +0000)]
[SyntaxTree] Rename functions to start with verb

According to LLVM coding standards:
https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly

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

4 years ago[InstCombine] propagate 'nsw' on pointer difference of 'inbounds' geps (PR47430)
Sanjay Patel [Thu, 10 Sep 2020 21:09:36 +0000 (17:09 -0400)]
[InstCombine] propagate 'nsw' on pointer difference of 'inbounds' geps (PR47430)

There's no signed wrap if both geps have 'inbounds':
https://alive2.llvm.org/ce/z/nZkQTg
https://alive2.llvm.org/ce/z/7qFauh

4 years ago[InstCombine] add/move tests for ptr diff; NFC
Sanjay Patel [Thu, 10 Sep 2020 20:38:12 +0000 (16:38 -0400)]
[InstCombine] add/move tests for ptr diff; NFC

4 years ago[LiveDebugValues][NFC] Add additional tests
Jeremy Morse [Fri, 11 Sep 2020 14:30:52 +0000 (15:30 +0100)]
[LiveDebugValues][NFC] Add additional tests

These were supposed to be in 0caeaff1237 and D83054, but a fat-fingered
error when git-adding missed them. Ooops.

4 years ago[NFC] Fix compiler warnings due to integer comparison of different signedness
Simon Pilgrim [Fri, 11 Sep 2020 14:32:03 +0000 (15:32 +0100)]
[NFC] Fix compiler warnings due to integer comparison of different signedness

Fix by directly using INT_MAX and INT32_MAX.

Patch by: @nullptr.cpp (Yang Fan)

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

4 years ago[libc++] NFC: Add missing license to test
Louis Dionne [Wed, 26 Aug 2020 14:43:05 +0000 (10:43 -0400)]
[libc++] NFC: Add missing license to test

4 years ago[analyzer][NFC] Don't bind values to ObjCForCollectionStmt, replace it with a GDM...
Kristóf Umann [Fri, 11 Sep 2020 13:51:25 +0000 (15:51 +0200)]
[analyzer][NFC] Don't bind values to ObjCForCollectionStmt, replace it with a GDM trait

Based on the discussion in D82598#2171312. Thanks @NoQ!

D82598 is titled "Get rid of statement liveness, because such a thing doesn't
exist", and indeed, expressions express a value, non-expression statements
don't.

if (a && get() || []{ return true; }())
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ has a value
    ~ has a value
    ~~~~~~~~~~ has a value
                  ~~~~~~~~~~~~~~~~~~~~ has a value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doesn't have a value

That is simple enough, so it would only make sense if we only assigned symbolic
values to expressions in the static analyzer. Yet the interface checkers can
access presents, among other strange things, the following two methods:

ProgramState::BindExpr(const Stmt *S, const LocationContext *LCtx, SVal V,
                       bool Invalidate=true)
ProgramState::getSVal(const Stmt *S, const LocationContext *LCtx)

So, what gives? Turns out, we make an exception for ReturnStmt (which we'll
leave for another time) and ObjCForCollectionStmt. For any other loops, in order
to know whether we should analyze another iteration, among other things, we
evaluate it's condition. Which is a problem for ObjCForCollectionStmt, because
it simply doesn't have one (CXXForRangeStmt has an implicit one!). In its
absence, we assigned the actual statement with a concrete 1 or 0 to indicate
whether there are any more iterations left. However, this is wildly incorrect,
its just simply not true that the for statement has a value of 1 or 0, we can't
calculate its liveness because that doesn't make any sense either, so this patch
turns it into a GDM trait.

Fixing this allows us to reinstate the assert removed in
https://reviews.llvm.org/rG032b78a0762bee129f33e4255ada6d374aa70c71.

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

4 years ago[gn build] Port 8da6ae4ce1b
LLVM GN Syncbot [Fri, 11 Sep 2020 13:49:35 +0000 (13:49 +0000)]
[gn build] Port 8da6ae4ce1b

4 years agoRevert "[ConstraintSystem] Add helpers to deal with linear constraints."
Florian Hahn [Fri, 11 Sep 2020 13:48:26 +0000 (14:48 +0100)]
Revert "[ConstraintSystem] Add helpers to deal with linear constraints."

This reverts commit 3eb141e5078a0ce9d92eadc721bc49d214d23056.

This uses __builtin_mul_overflow which is not available everywhere.

4 years ago[gn build] Port 3eb141e5078
LLVM GN Syncbot [Fri, 11 Sep 2020 13:43:45 +0000 (13:43 +0000)]
[gn build] Port 3eb141e5078

4 years ago[ConstraintSystem] Add helpers to deal with linear constraints.
Florian Hahn [Fri, 11 Sep 2020 13:33:06 +0000 (14:33 +0100)]
[ConstraintSystem] Add helpers to deal with linear constraints.

This patch introduces a new ConstraintSystem class, that maintains a set
of linear constraints and uses Fourier–Motzkin elimination to eliminate
constraints to check if there are solutions for the system.

It also adds a convert-constraint-log-to-z3.py script, which can parse
the debug output of the constraint system and convert it to a python
script that feeds the constraints into Z3 and checks if it produces the
same result as the LLVM implementation. This is for verification
purposes.

Reviewed By: spatel

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

4 years ago[libcxx] Handle target triples with dashes in platform name
Mikhail Maltsev [Fri, 11 Sep 2020 13:41:36 +0000 (14:41 +0100)]
[libcxx] Handle target triples with dashes in platform name

Target triples may contain a dash in the platform name (e.g.
"aarch64-arm-none-eabi"). Account for it when splitting the triple
into components.

Reviewed By: ldionne, #libc

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

4 years ago[flang] Add new documentation main page
Richard Barton [Fri, 11 Sep 2020 13:17:19 +0000 (14:17 +0100)]
[flang] Add new documentation main page

Add a new index page to be the Flang documentation mainpage instead of
Overview.md, which jumps straight into the compiler Design. The index file
needs to be in .rst format to use the toctree directive to create table of
contents.

Also use the sphinx_markdown_tables extension to generate html tables form
markdown.

A number of additional style changes to the existing docs were needed to make
this work well:
 * Convert all headings to the # style, which works better with toctree's
   titlesonly option. Ensure that there is only one top-level heading per
   document.
 * Add a title to documents that don't have one for rendering on the index.
 * Convert the grammar docs from .txt to .md. for better rendering
 * Fixed broken link to a section in another document - sphinx does not seem to
   support anchor links in markdown files.

Depends on D87226

Reviewed By: sameeranjoshi

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

4 years ago[ARM] Update arm-storebytesmerge.ll test. NFC
David Green [Fri, 11 Sep 2020 12:56:57 +0000 (13:56 +0100)]
[ARM] Update arm-storebytesmerge.ll test. NFC

This test was using a very odd combination of cortex-m7 and Neon. I have
changed it to thumbv7em only.

4 years ago[libTooling] Fix use of `char` in comparison.
Yitzhak Mandelbaum [Wed, 9 Sep 2020 19:11:47 +0000 (19:11 +0000)]
[libTooling] Fix use of `char` in comparison.

Fixes Transformer's `Range` parser to handle `char` in a platform-independent way.

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

4 years ago[MLIR][Linalg] Undo spurious parameter name change
Nicolas Vasilache [Fri, 11 Sep 2020 12:19:00 +0000 (08:19 -0400)]
[MLIR][Linalg] Undo spurious parameter name change

4 years ago[analyzer][MacroExpansion] Fix a crash where multiple parameters resolved to __VA_ARGS__
Kristóf Umann [Fri, 11 Sep 2020 11:51:54 +0000 (13:51 +0200)]
[analyzer][MacroExpansion] Fix a crash where multiple parameters resolved to __VA_ARGS__

In short, macro expansions handled the case where a variadic parameter mapped to
multiple arguments, but not the other way around. An internal ticket was
submitted that demonstrated that we fail an assertion. Macro expansion so far
worked by lexing the source code token-by-token and using the Preprocessor to
turn these tokens into identifiers or just get their proper spelling, but what
this counter intuitively doesn't do, is actually expand these macros, so we have
to do the heavy lifting -- in this case, figure out what __VA_ARGS__ expands
into. Since this case can only occur in a nested macro, the information we
gathered from the containing macro does contain this information. If a parameter
resolves to __VA_ARGS__, we need to temporarily stop getting our tokens from the
lexer, and get the tokens from what __VA_ARGS__ maps to.

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

4 years ago[mlir][Linalg] Refactor StructuredOpInterface - NFC
Nicolas Vasilache [Fri, 11 Sep 2020 10:19:07 +0000 (06:19 -0400)]
[mlir][Linalg] Refactor StructuredOpInterface - NFC

This revision refactors and cleans up a bunch of things to simplify StructuredOpInterface
before work can proceed on Linalg on tensors:
- break out pieces of the StructuredOps trait that are part of the StructuredOpInterface,
- drop referenceIterators and referenceIndexingMaps that end up being more confusing than useful,
- drop NamedStructuredOpTrait

4 years ago[analyzer][MacroExpansion][NFC] Fix a missing test output check
Kirstóf Umann [Wed, 12 Aug 2020 17:00:24 +0000 (19:00 +0200)]
[analyzer][MacroExpansion][NFC] Fix a missing test output check

4 years ago[NFC] Fix the signature and definition of findByPrefix
Andrzej Warzynski [Fri, 11 Sep 2020 11:17:51 +0000 (12:17 +0100)]
[NFC] Fix the signature and definition of findByPrefix

In https://reviews.llvm.org/rG257b29715bb27b7d9f6c3c40c481b6a4af0b37e5,
the definition of OptTable::Info::Flags was changed from `unsigned
short` to `unsigned int`, but the definition/declaration of
OptTable::findByPrefix wasn't updated to reflect that.

This patch updates findByPrefix accordingly.

4 years ago[analyzer][MacroExpansion][NFC] Fix incorrectly calling parameters arguments
Kirstóf Umann [Wed, 12 Aug 2020 15:54:49 +0000 (17:54 +0200)]
[analyzer][MacroExpansion][NFC] Fix incorrectly calling parameters arguments

4 years ago[analyzer][MacroExpansion] Add a few dumps functions
Kirstóf Umann [Wed, 12 Aug 2020 14:33:22 +0000 (16:33 +0200)]
[analyzer][MacroExpansion] Add a few dumps functions

4 years ago[LiveDebugValues][NFC] Re-land 60db26a66d, add instr-ref tests
Jeremy Morse [Fri, 11 Sep 2020 11:10:55 +0000 (12:10 +0100)]
[LiveDebugValues][NFC] Re-land 60db26a66d, add instr-ref tests

This was landed but reverted in 5b9c2b1bea7 due to asan picking up a memory
leak. This is fixed in the change to InstrRefBasedImpl.cpp. Original
commit message follows:

[LiveDebugValues][NFC] Add instr-ref tests, adapt old tests

This patch adds a few tests in DebugInfo/MIR/InstrRef/ of interesting
behaviour that the instruction referencing implementation of
LiveDebugValues has. Mostly, these tests exist to ensure that if you
give the "-experimental-debug-variable-locations" command line switch,
the right implementation runs; and to ensure it behaves the same way as
the VarLoc LiveDebugValues implementation.

I've also touched roughly 30 other tests, purely to make the tests less
rigid about what output to accept. DBG_VALUE instructions are usually
printed with a trailing !debug-location indicating its scope:

  !debug-location !1234

However InstrRefBasedLDV produces new DebugLoc instances on the fly,
meaning there sometimes isn't a numbered node when they're printed,
making the output:

  !debug-location !DILocation(line: 0, blah blah)

Which causes a ton of these tests to fail. This patch removes checks for
that final part of each DBG_VALUE instruction. None of them appear to
be actually checking the scope is correct, just that it's present, so
I don't believe there's any loss in coverage here.

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

4 years ago[IPO] Remove unnecessary Module.h includes. NFCI.
Simon Pilgrim [Fri, 11 Sep 2020 11:12:18 +0000 (12:12 +0100)]
[IPO] Remove unnecessary Module.h includes. NFCI.

Uses of Module are all implicit to PassInfoMixin<> so we can guarantee PassManager.h to handle it for us.