platform/upstream/llvm.git
2 years ago[clang][CodeGen][UBSan] VLA size checking for unsigned integer parameter
Adam Magier [Thu, 16 Dec 2021 23:56:43 +0000 (00:56 +0100)]
[clang][CodeGen][UBSan] VLA size checking for unsigned integer parameter

The code generation for the UBSan VLA size check was qualified by a con-
dition that the parameter must be a signed integer, however the C spec
does not make any distinction that only signed integer parameters can be
used to declare a VLA, only qualifying that it must be greater than zero
if it is not a constant.

Reviewed By: rjmccall

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

2 years ago[NFC][MLGO] Use ASSERT_TRUE in TFUtilsTest, where appropriate.
Mircea Trofin [Wed, 12 Jan 2022 00:10:02 +0000 (16:10 -0800)]
[NFC][MLGO] Use ASSERT_TRUE in TFUtilsTest, where appropriate.

2 years ago[LLDB][NativePDB] Add support for inlined functions
Zequan Wu [Sat, 8 Jan 2022 00:32:14 +0000 (16:32 -0800)]
[LLDB][NativePDB] Add support for inlined functions

This adds inline function support to NativePDB by parsing S_INLINESITE records
to retrieve inlinee line info and add them into line table at `ParseLineTable`.

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

2 years ago[NFC] Fixup for comment
Julian Lettner [Tue, 11 Jan 2022 23:34:46 +0000 (15:34 -0800)]
[NFC] Fixup for comment

2 years ago[MLIR][SCF] Canonicalize while statement whose cmp condition is recomputed in the...
William S. Moses [Tue, 11 Jan 2022 20:39:18 +0000 (15:39 -0500)]
[MLIR][SCF] Canonicalize while statement whose cmp condition is recomputed in the after region

Given a while loop whose condition is given by a cmp, don't recomputed the comparison (or its inverse) in the after region, instead use a constant since  the original condition must be true if we branched to the after region.

Reviewed By: mehdi_amini

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

2 years ago[TSan][Darwin] Enable Trace/TraceAlloc unit tests
Julian Lettner [Tue, 11 Jan 2022 23:30:17 +0000 (15:30 -0800)]
[TSan][Darwin] Enable Trace/TraceAlloc unit tests

These tests are now green:
```
  Trace.MultiPart
  Trace.RestoreAccess
  Trace.RestoreMutexLock
  TraceAlloc.FinishedThreadReuse
  TraceAlloc.FinishedThreadReuse2
  TraceAlloc.SingleThread
```

rdar://82107856

2 years ago[libc++] Temporarily disable the in_out_result test on Fuchsia.
Konstantin Varlamov [Tue, 11 Jan 2022 23:04:53 +0000 (15:04 -0800)]
[libc++] Temporarily disable the in_out_result test on Fuchsia.

2 years ago[TSan][Darwin] Mark test UNSUPPORTED for iOS simulator
Julian Lettner [Tue, 11 Jan 2022 22:59:52 +0000 (14:59 -0800)]
[TSan][Darwin] Mark test UNSUPPORTED for iOS simulator

2 years ago[sanitizer_common] Only use NT_GNU_BUILD_ID in sanitizer_linux_libcdep.cpp if supported
Rainer Orth [Tue, 11 Jan 2022 22:50:37 +0000 (23:50 +0100)]
[sanitizer_common] Only use NT_GNU_BUILD_ID in sanitizer_linux_libcdep.cpp if supported

D114294 <https://reviews.llvm.org/D114294> broke the Solaris buildbots:

  /opt/llvm-buildbot/home/solaris11-amd64/clang-solaris11-amd64/llvm/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp:613:29: error: use of undeclared identifier 'NT_GNU_BUILD_ID'
          if (nhdr->n_type == NT_GNU_BUILD_ID && nhdr->n_namesz == kGnuNamesz) {
                              ^

Like D107556 <https://reviews.llvm.org/D107556>, it forgot that
`NT_GNU_BUILD_ID` is an unportable GNU extension.

Fixed by making the code conditional on the definition of the macro.

Tested on `amd64-pc-solaris2.11` and `sparcv9-sun-solaris2.11`.

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

2 years ago[llvm-libtool-darwin] Print a warning if object file names are repeated
Roger Kim [Tue, 11 Jan 2022 22:38:25 +0000 (14:38 -0800)]
[llvm-libtool-darwin] Print a warning if object file names are repeated

Print a warning if `llvm-libtool-darwin` if any of the object
files provided by the user have the same file name.

The tool will now print a warning if there is a name collision across:

* Two object files
* An object file and an object file from within a static library
* Two object files from different static libraries

Here is an example of the error:

```
$ llvm-libtool-darwin -static -o archive.a out.o out.o
error: file 'out.o' was specified multiple times.
in: out.o
in: out.o

$ llvm-libtool-darwin -static -o archive.a out.o
$ llvm-libtool-darwin -static -o combined.a archive.a out.o
error: file 'out.o' was specified multiple times.
in: archive.a
in: out.o
```

This change mimics apple's cctools libtool's behavior which always shows a warning in such cases.

Reviewed By: smeenai

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

2 years ago[NFC][llvm-libtool-darwin] Encapsulate the process of adding a new member in a class
Roger Kim [Tue, 11 Jan 2022 22:37:33 +0000 (14:37 -0800)]
[NFC][llvm-libtool-darwin] Encapsulate the process of adding a new member in a class

Here we are refactoring the code to encapsulate data into classes. This allows
us to avoid passing the same objects through many functions that don't directly
use them. Now, functions that need to access data can do so from the class
state.

Reviewed By: jhenderson, smeenai

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

2 years agoAdd 'eager-checks' as a module parameter to MSAN.
Kevin Athey [Tue, 11 Jan 2022 21:20:12 +0000 (13:20 -0800)]
Add 'eager-checks' as a module parameter to MSAN.

This creates a way to configure MSAN to for eager checks that will be leveraged
by the introduction of a clang flag (-fsanitize-memory-param-retval).

This is redundant with the existing flag: -mllvm -msan-eager-checks.

Reviewed By: vitalybuka

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

2 years ago[libc++] Introduce __fits_in_sso()
Nikolas Klauser [Tue, 4 Jan 2022 16:24:03 +0000 (17:24 +0100)]
[libc++] Introduce __fits_in_sso()

Introduce `__fits_in_sso()` to put the constexpr tests into a central place.

Reviewed By: ldionne, #libc

Spies: libcxx-commits

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

2 years ago[libc++] Add Status page for P2321R2 (Zip)
Nikolas Klauser [Thu, 6 Jan 2022 22:12:55 +0000 (23:12 +0100)]
[libc++] Add Status page for P2321R2 (Zip)

Add a status page for P2321R2

Reviewed By: ldionne, Mordante, #libc

Spies: jloser, libcxx-commits, arphaman

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

2 years ago[libc++] Introduce __debug_db_insert_c()
Nikolas Klauser [Mon, 10 Jan 2022 23:33:35 +0000 (00:33 +0100)]
[libc++] Introduce __debug_db_insert_c()

There are a lot of
```
#if _LIBCPP_DEBUG_LEVEL == 2
    __get_db()->__insert_c(this);
#endif
```

This patch introduces `__debug_db_insert_c()` to put the `#if` in one central place.

Reviewed By: ldionne, #libc

Spies: libcxx-commits

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

2 years ago[clang][#47272] Avoid suggesting deprecated version of a declaration over another...
Markus Böck [Mon, 10 Jan 2022 07:42:45 +0000 (08:42 +0100)]
[clang][#47272] Avoid suggesting deprecated version of a declaration over another in typo correction

Prior to this patch, clang might suggest a deprecated name of a declaration over another name as the only mechanism for resolving two typo corrections referring to the same underlying declaration has previously been an alphabetical sort.

This patch adjusts this resolve by also taking into account whether one of two declarations are deprecated. If the new one is deprecated it may not replace a previous correction with a non-deprecated correction and a previous deprecated correction always gets replaced by a non-deprecated new correction.

Fixes https://github.com/llvm/llvm-project/issues/47272

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

2 years ago[MCA] Switching from conservatively guessing which instructions are
Patrick Holland [Mon, 3 Jan 2022 00:37:14 +0000 (16:37 -0800)]
[MCA] Switching from conservatively guessing which instructions are
memory-barrier instructions to providing targets and developers a convenient
way to explicitly declare which instructions are memory-barriers.

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

2 years ago[mlir][Linalg] Pattern to fuse pad operation with elementwise operations.
MaheshRavishankar [Tue, 11 Jan 2022 21:35:37 +0000 (13:35 -0800)]
[mlir][Linalg] Pattern to fuse pad operation with elementwise operations.

Most convolution operations need explicit padding of the input to
ensure all accesses are inbounds. In such cases, having a pad
operation can be a significant overhead. One way to reduce that
overhead is to try to fuse the pad operation with the producer of its
source.

A sequence

```
linalg.generic -> linalg.pad_tensor
```

can be replaced with

```
linalg.fill -> tensor.extract_slice -> linalg.generic ->
tensor.insert_slice.
```

if the `linalg.generic` has all parallel iterator types.

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

2 years ago[AIX] add the xcoff symbol size for the llvm-nm.
zhijian [Tue, 11 Jan 2022 21:24:43 +0000 (16:24 -0500)]
[AIX] add the xcoff symbol size for the llvm-nm.

Summary:

add the xcoff symbol size for the llvm-nm.

Reviewers: James Henderson
Differential Revision: https://reviews.llvm.org/D113104

2 years agoRevert D109159 : Revert "[amdgpu] Enable selection of `s_cselect_b64`."
David Salinas [Wed, 5 Jan 2022 18:47:32 +0000 (18:47 +0000)]
Revert D109159 : Revert "[amdgpu] Enable selection of `s_cselect_b64`."

This reverts commit 640beb38e7710b939b3cfb3f4c54accc694b1d30.

That commit caused performance degradtion in Quicksilver test QS:sGPU and a functional test failure in (rocPRIM rocprim.device_segmented_radix_sort).
Reverting until we have a better solution to s_cselect_b64 codegen cleanup

Change-Id: Ifc167b3c2dae7a65920676f22a97ba76485f3456

Reviewed By: kzhuravl

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

Change-Id: I1abf49b74a7e2ba0e0205f747a4154a468b9d7f2

2 years agoGlobalISel: Use cloneVirtualRegister in localizer
Matt Arsenault [Tue, 11 Jan 2022 17:56:24 +0000 (12:56 -0500)]
GlobalISel: Use cloneVirtualRegister in localizer

2 years agoAMDGPU/GlobalISel: Regenerate baseline checks to include -NEXT
Matt Arsenault [Tue, 11 Jan 2022 20:28:44 +0000 (15:28 -0500)]
AMDGPU/GlobalISel: Regenerate baseline checks to include -NEXT

2 years ago[InstCombine] Pull out a helper function to simplify upcoming patch [NFC]
Philip Reames [Tue, 11 Jan 2022 21:05:25 +0000 (13:05 -0800)]
[InstCombine] Pull out a helper function to simplify upcoming patch [NFC]

2 years ago[DSE] Seperate malloc+memset -> calloc transform from noop store dedection [NFC]
Philip Reames [Tue, 11 Jan 2022 20:33:44 +0000 (12:33 -0800)]
[DSE] Seperate malloc+memset -> calloc transform from noop store dedection [NFC]

This transformation has nothing to do with whether the store is a noop.  The memset becomes a noop, but only after we replace the malloc with a calloc.

2 years ago[AIX] support xcoff for llvm-nm
zhijian [Tue, 11 Jan 2022 20:53:25 +0000 (15:53 -0500)]
[AIX] support xcoff for llvm-nm

Summary:

add the xcoff symbol type functionality for llvm-nm.

Reviewers: James Henderson
Differential Revision: https://reviews.llvm.org/D112450

2 years ago[NFC][MLGO] Remove the word "inliner" in a generic error message.
Mircea Trofin [Tue, 11 Jan 2022 20:36:16 +0000 (12:36 -0800)]
[NFC][MLGO] Remove the word "inliner" in a generic error message.

2 years agoMerge BOLT into LLVM monorepo
Maksim Panchenko [Tue, 11 Jan 2022 20:35:14 +0000 (12:35 -0800)]
Merge BOLT into LLVM monorepo

Details of the merge are available at llvm-dev.

Mailing-list: https://lists.llvm.org/pipermail/llvm-dev/2022-January/154638.html [llvm-dev] Preparing BOLT for LLVM monorepo

Co-authored-by: Rafael Auler <rafaelauler@fb.com>
2 years ago[DSE] Minor style improvements to calloc formation code [NFC]
Philip Reames [Tue, 11 Jan 2022 20:14:28 +0000 (12:14 -0800)]
[DSE] Minor style improvements to calloc formation code [NFC]

2 years ago[clang] number labels in asm goto strings after tied inputs
Nick Desaulniers [Tue, 11 Jan 2022 19:51:22 +0000 (11:51 -0800)]
[clang] number labels in asm goto strings after tied inputs

I noticed that the following case would compile in Clang but not GCC:
    void *x(void) {
      void *p = &&foo;
      asm goto ("# %0\n\t# %l1":"+r"(p):::foo);
      foo:;
      return p;
    }

Changing the output template above from %l2 would compile in GCC but not
Clang.

This demonstrates that when using tied outputs (say via the "+r" output
constraint), the hidden inputs occur or are numbered BEFORE the labels,
at least with GCC.

In fact, GCC does denote this in its documentation:
https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc/Extended-Asm.html#Goto-Labels

> Output operand with constraint modifier ‘+’ is counted as two operands
> because it is considered as one output and one input operand.

For the sake of compatibility, I think it's worthwhile to just make this
change.

It's better to use symbolic names for compatibility (especially now
between released version of Clang that support asm goto with outputs).
ie. %l1 from the above would be %l[foo]. The GCC docs also make this
recommendation.

Also, I cleaned up some cruft in GCCAsmStmt::getNamedOperand. AFAICT,
NumPlusOperands was no longer used, though I couldn't find which commit
didn't clean that up correctly.

Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98096
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103640
Link: https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc/Extended-Asm.html#Goto-Labels
Reviewed By: void

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

2 years agoAccept string literal decay in conditional operator
Elvis Stansvik [Tue, 11 Jan 2022 20:04:27 +0000 (15:04 -0500)]
Accept string literal decay in conditional operator

The cppcoreguidelines-pro-bounds-array-to-pointer-decay check currently
accepts:

const char *b = i ? "foo" : "foobar";

but not

const char *a = i ? "foo" : "bar";

This is because the AST is slightly different in the latter case (see
https://godbolt.org/z/MkHVvs).

This eliminates the inconsistency by making it accept the latter form
as well.

Fixes https://github.com/llvm/llvm-project/issues/31155.

2 years ago[DSE] Generalize store null to calloc allocated memory [NFC-ish]
Philip Reames [Tue, 11 Jan 2022 20:00:42 +0000 (12:00 -0800)]
[DSE] Generalize store null to calloc allocated memory [NFC-ish]

This change removes a direct check for calloc-like allocation functions, and instead handles the generic case where we're storing a constant to constant initialized memory.  This is mostly to remove the call to isCallocLike, but if someone downstream happens to have an initialized alloc which initializes to e.g. -1, this will also kick in for them.  (I don't know of such an example ftr.)

2 years ago[MLIR][LLVM] Add MemRead/MemWrite behavior to llvm store/load/addressof ops
William S. Moses [Tue, 11 Jan 2022 18:33:43 +0000 (13:33 -0500)]
[MLIR][LLVM] Add MemRead/MemWrite behavior to llvm store/load/addressof ops

This patch adds corresponding memory effects to mlir llvm-dialect load/store/addressof ops, which thus enables canonicalizations of those ops (like dead code elimination) that rely on the effect interface

Reviewed By: mehdi_amini

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

2 years ago[HIP] Fix device malloc/free
Yaxun (Sam) Liu [Mon, 10 Jan 2022 17:57:41 +0000 (12:57 -0500)]
[HIP] Fix device malloc/free

ROCm 4.5 device library introduced __ockl_dm_alloc and __ockl_dm_dealloc
for supporting device side malloc/free.

This patch redefines device malloc/free to use these functions.

It also fixes a bug in the wrapper header which incorrectly defines free
with return type void* instead of void.

Reviewed by: Artem Belevich

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

2 years ago[gn build] (manually) port f77d115cc136 more
Nico Weber [Tue, 11 Jan 2022 19:49:08 +0000 (14:49 -0500)]
[gn build] (manually) port f77d115cc136 more

2 years ago[clang][CGStmt] emit i constraint rather than X for asm goto indirect dests
Nick Desaulniers [Tue, 11 Jan 2022 19:32:35 +0000 (11:32 -0800)]
[clang][CGStmt] emit i constraint rather than X for asm goto indirect dests

As suggested in:
https://reviews.llvm.org/D114895#3177794
X will be converted to i by SelectionDAGISEL anyways.

Reviewed By: void, jyknight

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

2 years ago[NFC][SimplifyCFG] Add some more tests for sinking into 'unreachable' block
Roman Lebedev [Tue, 11 Jan 2022 19:18:28 +0000 (22:18 +0300)]
[NFC][SimplifyCFG] Add some more tests for sinking into 'unreachable' block

2 years agoFix bazel build after f77d115cc136585f39d30a78c741eb296f9e804d.
James Y Knight [Tue, 11 Jan 2022 17:55:35 +0000 (17:55 +0000)]
Fix bazel build after f77d115cc136585f39d30a78c741eb296f9e804d.

2 years ago[llvm][test] rewrite callbr to use i rather than X constraint NFC
Nick Desaulniers [Tue, 11 Jan 2022 19:08:48 +0000 (11:08 -0800)]
[llvm][test] rewrite callbr to use i rather than X constraint NFC

In D115311, we're looking to modify clang to emit i constraints rather
than X constraints for callbr's indirect destinations. Prior to doing
so, update all of the existing tests in llvm/ to match.

Reviewed By: void, jyknight

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

2 years ago[CodeGen] Treat ObjC `__unsafe_unretained` and class types as trivial
Akira Hatanaka [Sat, 8 Jan 2022 21:27:28 +0000 (13:27 -0800)]
[CodeGen] Treat ObjC `__unsafe_unretained` and class types as trivial
when generating copy/dispose helper functions

Analyze the block captures just once before generating copy/dispose
block helper functions and honor the inert `__unsafe_unretained`
qualifier. This refactor fixes a bug where captures of ObjC
`__unsafe_unretained` and class types were needlessly retained/released
by the copy/dispose helper functions.

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

2 years agoApply clang-tidy fixes for readability-redundant-control-flow in OpenMPDialect.cpp...
Mehdi Amini [Tue, 11 Jan 2022 00:31:22 +0000 (00:31 +0000)]
Apply clang-tidy fixes for readability-redundant-control-flow in OpenMPDialect.cpp (NFC)

2 years agoFix clang-tidy bugprone-argument-comment that was mixed up
Shafik Yaghmour [Tue, 11 Jan 2022 18:30:32 +0000 (10:30 -0800)]
Fix clang-tidy bugprone-argument-comment that was mixed up

Several of the comments were annotating the wrong argument.

I caught this while reviewing this clean-up: https://github.com/llvm/llvm-project/commit/8afcfbfb8fc1e53023ffac9d9bdc424248d6d2ff

which was changing booleans to use true and false and in the this case the comment and the type looked mismatched.

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

2 years ago[mlir] Fix a missing override warning
Kazu Hirata [Tue, 11 Jan 2022 19:03:22 +0000 (11:03 -0800)]
[mlir] Fix a missing override warning

This patch fixes:

  mlir/lib/Dialect/Tosa/Transforms/TosaOptionalDecompositions.cpp:28:8:
  error: 'runOnFunction' overrides a member function but is not marked
  'override' [-Werror,-Wsuggest-override]

2 years ago[SelectionDAG] treat X constrained labels as i for asm
Nick Desaulniers [Tue, 11 Jan 2022 18:16:33 +0000 (10:16 -0800)]
[SelectionDAG] treat X constrained labels as i for asm

Completely rework how we handle X constrained labels for inline asm.

X should really be treated as i. Then existing tests can be moved to use
i D115410 and clang can just emit i D115311. (D115410 and D115311 are
callbr, but this can be done for label inputs, too).

Coincidentally, this simplification solves an ICE uncovered by D87279
based on assumptions made during D69868.

This is the third approach considered. See also discussions v1 (D114895)
and v2 (D115409).

Reported-by: kernel test robot <lkp@intel.com>
Fixes: https://github.com/ClangBuiltLinux/linux/issues/1512

Reviewed By: void, jyknight

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

2 years ago[mlir][tosa] Allow optional TOSA decompositions to be populated separately
Aaron DeBattista [Tue, 11 Jan 2022 18:16:01 +0000 (10:16 -0800)]
[mlir][tosa] Allow optional TOSA decompositions to be populated separately

Moved all TOSA decomposition patterns so that they can be optionally populated
and used by external rewrites. This avoids decomposing TOSa operations when
backends may benefit from the non-decomposed version.

Reviewed By: rsuderman, mehdi_amini

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

2 years ago[libc++][libc++abi][libunwind] Dedup install path var definitions
John Ericson [Tue, 11 Jan 2022 03:03:21 +0000 (03:03 +0000)]
[libc++][libc++abi][libunwind] Dedup install path var definitions

In D116873 I did this for libunwind prior to defining a new install path
variable. But I think the change is good on its own, and libc++{,abi}
could also use it.

libc++ needed the base header var defined above the conditional part to
use it for the prefi+ed headers in the non-target-specific case. For
consistency, I therefore put the unconditional ones above for all 3
libs, which is why I touched the libunwind code (seeing that it had the
core change already)

Reviewed By: phosek, #libunwind, #libc, #libc_abi, ldionne

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

2 years ago[NFC][LazyCallGraph] Remove check in removeDeadFunction() if graph is empty
Arthur Eubanks [Mon, 13 Dec 2021 21:59:47 +0000 (13:59 -0800)]
[NFC][LazyCallGraph] Remove check in removeDeadFunction() if graph is empty

If we're in removeDeadFunction(), we should have already constructed the call graph.

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

2 years ago[ShrinkWrap] check for PPC's non-callee-saved LR
Nick Desaulniers [Tue, 11 Jan 2022 18:01:25 +0000 (10:01 -0800)]
[ShrinkWrap] check for PPC's non-callee-saved LR

As pointed out in https://reviews.llvm.org/D115688#inline-1108193, we
don't want to sink the save point past an INLINEASM_BR, otherwise
prologepilog may incorrectly sink a prolog past the MBB containing an
INLINEASM_BR and into the wrong MBB.

ShrinkWrap is getting this wrong because LR is not in the list of callee
saved registers. Specifically, ShrinkWrap::useOrDefCSROrFI calls
RegisterClassInfo::getLastCalleeSavedAlias which reads
CalleeSavedAliases which was populated by
RegisterClassInfo::runOnMachineFunction by iterating the list of
MCPhysReg returned from MachineRegisterInfo::getCalleeSavedRegs.

Because PPC's LR is non-allocatable, it's NOT considered callee saved.
Add an interface to TargetRegisterInfo for such a case and use it in
Shrinkwrap to ensure we don't sink a prolog past an INLINEASM or
INLINEASM_BR that clobbers LR.

Reviewed By: jyknight, efriedma, nemanjai, #powerpc

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

2 years ago[mlir][tosa] Relax tosa.apply_scale operations
Rob Suderman [Tue, 11 Jan 2022 17:49:36 +0000 (09:49 -0800)]
[mlir][tosa] Relax tosa.apply_scale operations

Apply scale may operate on vectors, scalars, or tensors during
tiling. Relax the requirements to avoid failures.

Reviewed By: NatashaKnk

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

2 years ago[MLIR][SCF] Simplify scf.if by swapping regions if condition is a not
William S. Moses [Tue, 11 Jan 2022 03:27:14 +0000 (22:27 -0500)]
[MLIR][SCF] Simplify scf.if by swapping regions if condition is a not

Given an if of the form, simplify it by eliminating the not and swapping the regions

scf.if not(c) {
  yield origTrue
} else {
  yield origFalse
}

becomes

scf.if c {
  yield origFalse
} else {
  yield origTrue
}

Reviewed By: mehdi_amini

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

2 years ago[ELF] Add RelocationScanner. NFC
Fangrui Song [Tue, 11 Jan 2022 17:54:53 +0000 (09:54 -0800)]
[ELF] Add RelocationScanner. NFC

Currently the way some relocation-related static functions pass around
states is clumsy. Add a Resolver class to store some states as member
variables.

Advantages:

* Avoid the parameter `InputSectionBase &sec` (this offsets the cost passing around `this` paramemter)
* Avoid the parameter `end` (Mips and PowerPC hacks)
* `config` and `target` can be cached as member variables to reduce global state accesses. (potential speedup because the compiler didn't know `config`/`target` were not changed across function calls)
* If we ever want to reduce if-else costs (e.g. `config->emachine==EM_MIPS` for non-Mips) or introduce parallel relocation scan not handling some tricky arches (PPC/Mips), we can templatize Resolver

`target` isn't used as much as `config`, so I change it to a const reference
during the migration.

There is a minor performance inprovement for elf::scanRelocations.

Reviewed By: ikudrin, peter.smith

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

2 years ago[mlir][linalg] Improve pooling op iterator order consistency
Lei Zhang [Tue, 11 Jan 2022 17:04:39 +0000 (17:04 +0000)]
[mlir][linalg] Improve pooling op iterator order consistency

All named ops list iterators for accessing output first except
pooling ops. This commit made the pooling ops consistent with
the rest.

Reviewed By: nicolasvasilache

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

2 years agoFix bazel build after 8503c688d555014b88849e933bf096035a351586.
James Y Knight [Tue, 11 Jan 2022 17:42:49 +0000 (17:42 +0000)]
Fix bazel build after 8503c688d555014b88849e933bf096035a351586.

2 years ago[IRBuilder] Introduce folder using inst-simplify, use for Or fold.
Florian Hahn [Tue, 11 Jan 2022 17:30:48 +0000 (17:30 +0000)]
[IRBuilder] Introduce folder using inst-simplify, use for Or fold.

Alternative to D116817.

This introduces a new value-based folding interface for Or (FoldOr),
which takes 2 values and returns an existing Value or a constant if the
Or can be simplified. Otherwise nullptr is returned. This replaces the
more restrictive CreateOr which takes 2 constants.

This is the used to implement a folder that uses InstructionSimplify.
The logic to simplify `Or` instructions is moved there. Subsequent
patches are going to transition other CreateXXX to the more general
FoldXXX interface.

Reviewed By: nikic, lebedev.ri

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

2 years ago[clang-format] Fix SeparateDefinitionBlocks issues
ksyx [Wed, 5 Jan 2022 15:20:16 +0000 (10:20 -0500)]
[clang-format] Fix SeparateDefinitionBlocks issues

Fixes https://github.com/llvm/llvm-project/issues/52976.

- Make no formatting for macros
- Attach comment with definition headers
- Make no change on use of empty lines at block start/end
- Fix misrecognition of keyword namespace

Differential Revision: https://reviews.llvm.org/D116663
Reviewed By: MyDeveloperDay, HazardyKnusperkeks, curdeius

2 years ago[instsimplify] Add a comment and test for a highly confusing case
Philip Reames [Tue, 11 Jan 2022 17:23:33 +0000 (09:23 -0800)]
[instsimplify] Add a comment and test for a highly confusing case

2 years ago[gn build] Port f77d115cc136
LLVM GN Syncbot [Tue, 11 Jan 2022 17:12:28 +0000 (17:12 +0000)]
[gn build] Port f77d115cc136

2 years agoX86InstrInfo: Support immediates that are +1/-1 different in optimizeCompareInstr
Matthias Braun [Tue, 28 Sep 2021 00:57:22 +0000 (17:57 -0700)]
X86InstrInfo: Support immediates that are +1/-1 different in optimizeCompareInstr

This is a re-commit of e2c7ee0743592e39274e28dbe0d0c213ba342317 which
was reverted in a2a58d91e82db38fbdf88cc317dcb3753d79d492 and
ea81cea8163a1a0e54df42103ee1c657bbf03791. This includes a fix to
consistently check for EFLAGS being live-out. See phabricator
review.

Original Summary:

This extends `optimizeCompareInstr` to re-use previous comparison
results if the previous comparison was with an immediate that was 1
bigger or smaller. Example:

    CMP x, 13
    ...
    CMP x, 12   ; can be removed if we change the SETg
    SETg ...    ; x > 12  changed to `SETge` (x >= 13) removing CMP

Motivation: This often happens because SelectionDAG canonicalization
tends to add/subtract 1 often when optimizing for fallthrough blocks.
Example for `x > C` the fallthrough optimization switches true/false
blocks with `!(x > C)` --> `x <= C` and canonicalization turns this into
`x < C + 1`.

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

2 years ago[RISCV] Add DAG combine to fold (fp_to_int (ffloor X)) -> (fcvt X, rdn)
Craig Topper [Tue, 11 Jan 2022 16:55:45 +0000 (08:55 -0800)]
[RISCV] Add DAG combine to fold (fp_to_int (ffloor X)) -> (fcvt X, rdn)

Similar for ceil, trunc, round, and roundeven. This allows us to use
static rounding modes to avoid a libcall.

This optimization is done for AArch64 as isel patterns.
RISCV doesn't have instructions for ceil/floor/trunc/round/roundeven
so the operations don't stick around until isel to enable a pattern
match. Thus I've implemented a DAG combine.

We only handle XLen types except i32 on RV64. i32 will be type
legalized to a RISCVISD node. All other types will be type legalized
to XLen and maintain the FP_TO_SINT/UINT ISD opcode.

Reviewed By: asb

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

2 years ago[SPIR-V] Drop double quote from test pattern
Sven van Haastregt [Tue, 11 Jan 2022 16:54:19 +0000 (16:54 +0000)]
[SPIR-V] Drop double quote from test pattern

When spirv-link is found, it won't match a leading `"`.  This fixes
the test added by commit dbb8d086377b ("[SPIR-V] Add linking using
spirv-link.", 2022-01-11).

2 years ago[clang] Move `ApplyHeaderSearchOptions` from Frontend to Lex
Jan Svoboda [Tue, 11 Jan 2022 16:17:07 +0000 (17:17 +0100)]
[clang] Move `ApplyHeaderSearchOptions` from Frontend to Lex

In D116750, the `clangFrontend` library was added as a dependency of `LexTests` in order to make `clang::ApplyHeaderSearchOptions()` available. This increased the number of TUs the test depends on.

This patch moves the function into `clangLex` and removes dependency of `LexTests` on `clangFrontend`.

Reviewed By: thakis

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

2 years ago[libc][NFC] Move sys/mman entrypoints to the default build configs.
Siva Chandra Reddy [Tue, 11 Jan 2022 05:24:57 +0000 (05:24 +0000)]
[libc][NFC] Move sys/mman entrypoints to the default build configs.

Specifically, mmap and munmap have been moved to the default build list
of entrypoints. To support this, certain deps and includes have been
adjusted. The use of errno in some cases has been updated.

2 years agoMark arith.minf, arith.maxf as commutative.
Christian Sigg [Tue, 11 Jan 2022 12:13:17 +0000 (13:13 +0100)]
Mark arith.minf, arith.maxf as commutative.

Reviewed By: herhut

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

2 years ago[GlobalsModRef] Apply indirect-global rule to all globals initialized from noalias...
Philip Reames [Tue, 11 Jan 2022 16:40:03 +0000 (08:40 -0800)]
[GlobalsModRef] Apply indirect-global rule to all globals initialized from noalias calls

Extend the existing malloc-family specific optimization to all noalias calls.  This allows us to handle allocation wrappers, and removes a dependency on a lib-func check in favor of generic attribute usage.

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

2 years ago[X86] Apply clang-format to X86TargetLowering::isVectorShiftByScalarCheap
Simon Pilgrim [Tue, 11 Jan 2022 16:40:24 +0000 (16:40 +0000)]
[X86] Apply clang-format to X86TargetLowering::isVectorShiftByScalarCheap

Fix indentation

2 years ago[DSE] Style improvements after 3cef3cf - remove redundant dyn_casts [NFC]
Philip Reames [Tue, 11 Jan 2022 16:37:41 +0000 (08:37 -0800)]
[DSE] Style improvements after 3cef3cf - remove redundant dyn_casts [NFC]

I'd been working on exactly the same patch when Nikita landed his, so this patch is basically the style diff between the two.  :)

2 years ago[Nomination] Adding Intel representatives to security group
Dimitry Andric [Tue, 11 Jan 2022 16:30:19 +0000 (17:30 +0100)]
[Nomination] Adding Intel representatives to security group

We would like to nominate Andy Kaylor and Sergey Maslov to join the LLVM security group as a representative of Intel.  Both are members of the Intel compiler team, and would like to register as vendor contacts.  Intel packages and distributes LLVM-based toolchains as part of our compiler products.   As such, we would like to be aware of any security vulnerability found in the compiler, and would like to contribute to the resolution of such issues.

Please let us know if anything is missing from the nomination.

Reviewed By: apilipenko, dim, george.burgess.iv, kristof.beyls, mattdr, nikhgupt, probinson, peter.smith, pietroalbini, steveklabnik

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

2 years ago[InstSimplify] Fold inbounds GEP to poison if base is undef.
Florian Hahn [Tue, 11 Jan 2022 16:11:22 +0000 (16:11 +0000)]
[InstSimplify] Fold inbounds GEP to poison if base is undef.

D92270 updated constant expression folding to fold inbounds GEP to
poison if the base is undef. Apply the same logic to SimplifyGEPInst.

The justification is that we can choose an out-of-bounds pointer as base
pointer.

Reviewed By: nikic, lebedev.ri

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

2 years ago[mips][lld] Add test case to check symbol index reading on mips64el. NFC
Simon Atanasyan [Tue, 11 Jan 2022 16:06:40 +0000 (19:06 +0300)]
[mips][lld] Add test case to check symbol index reading on mips64el. NFC

2 years ago[mips] Use `push_back` to insert element at the end of a container. NFC
Simon Atanasyan [Tue, 11 Jan 2022 05:56:26 +0000 (08:56 +0300)]
[mips] Use `push_back` to insert element at the end of a container. NFC

2 years ago[X86] Tag existing shuffle test case as PR53124
Simon Pilgrim [Tue, 11 Jan 2022 15:11:06 +0000 (15:11 +0000)]
[X86] Tag existing shuffle test case as PR53124

The poor AVX1 codegen matches the core issue raised in PR53124

2 years ago[SCEV] `getSequentialMinMaxExpr()`: look into `umin` when deduplicating operands
Roman Lebedev [Tue, 11 Jan 2022 15:23:02 +0000 (18:23 +0300)]
[SCEV] `getSequentialMinMaxExpr()`: look into `umin` when deduplicating operands

We could just merge all umin into umin_seq, but that is likely
a pessimization, so don't do that, but pretend that we did
for the purpose of deduplication.

2 years ago[NFC][SCEV] More tests with operand-wise redundant operands of umin of umin_seq
Roman Lebedev [Tue, 11 Jan 2022 15:25:53 +0000 (18:25 +0300)]
[NFC][SCEV] More tests with operand-wise redundant operands of umin of umin_seq

2 years ago[compiler-rt] Silence warnings when building with MSVC
Alexandre Ganea [Tue, 11 Jan 2022 15:36:46 +0000 (10:36 -0500)]
[compiler-rt] Silence warnings when building with MSVC

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

2 years ago[libc++] Use TEST_HAS_NO_UNICODE instead of _LIBCPP_HAS_NO_UNICODE in the test suite
Louis Dionne [Mon, 10 Jan 2022 22:14:01 +0000 (17:14 -0500)]
[libc++] Use TEST_HAS_NO_UNICODE instead of _LIBCPP_HAS_NO_UNICODE in the test suite

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

2 years ago[ASan] Driver changes to always link-in asan_static library.
Kirill Stoimenov [Wed, 5 Jan 2022 17:14:40 +0000 (17:14 +0000)]
[ASan] Driver changes to always link-in asan_static library.

This enables the changes from D116182.

Reviewed By: vitalybuka

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

2 years ago[GlobalStatus] Look through non-constexpr casts
Nikita Popov [Tue, 11 Jan 2022 15:00:13 +0000 (16:00 +0100)]
[GlobalStatus] Look through non-constexpr casts

analyzeGlobal() looks through non-constexpr cast instructions when
looking for users. However, this particular place only strips the
casts again if they are constexprs. We should be looking through all
casts here.

2 years ago[NFC][SCEV] Add more tests for umin_seq with redundant operands
Roman Lebedev [Tue, 11 Jan 2022 14:33:15 +0000 (17:33 +0300)]
[NFC][SCEV] Add more tests for umin_seq with redundant operands

2 years ago[gn build] (manually) port 8503c688d555
Nico Weber [Tue, 11 Jan 2022 14:47:28 +0000 (09:47 -0500)]
[gn build] (manually) port 8503c688d555

2 years ago[GlobalOpt] Regenerate test checks (NFC)
Nikita Popov [Tue, 11 Jan 2022 14:34:16 +0000 (15:34 +0100)]
[GlobalOpt] Regenerate test checks (NFC)

2 years ago[clang][lex] Keep references to `DirectoryLookup` objects up-to-date
Jan Svoboda [Tue, 11 Jan 2022 13:47:03 +0000 (14:47 +0100)]
[clang][lex] Keep references to `DirectoryLookup` objects up-to-date

The elements of `SearchPath::SearchDirs` are being referenced to by their indices. This proved to be error-prone: `HeaderSearch::SearchDirToHSEntry` was accidentally not being updated in `HeaderSearch::AddSearchPath()`. This patch fixes that by referencing `SearchPath::SearchDirs` elements by their address instead, which is stable thanks to the bump-ptr-allocation strategy.

Reviewed By: ahoppen

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

2 years ago[mlir][linalg] Use cast instead of dyn_cast that's always dereferenced
Benjamin Kramer [Tue, 11 Jan 2022 14:05:45 +0000 (15:05 +0100)]
[mlir][linalg] Use cast instead of dyn_cast that's always dereferenced

This turns a random nullptr deref into an assertion failure in case
`tensor::registerInferTypeOpInterfaceExternalModels` isn't called.

2 years ago[SCEV] `getSequentialMinMaxExpr()`: keep only the first instance of an operand
Roman Lebedev [Tue, 11 Jan 2022 13:45:22 +0000 (16:45 +0300)]
[SCEV] `getSequentialMinMaxExpr()`: keep only the first instance of an operand

Having the same operand more than once doesn't change the outcome here,
neither reduction-wise nor poison-wise.
We must keep the first instance specifically though.

2 years ago[SCEV] Add test for umin_seq with duplicate operands
Roman Lebedev [Tue, 11 Jan 2022 13:24:29 +0000 (16:24 +0300)]
[SCEV] Add test for umin_seq with duplicate operands

2 years ago[SPIR-V] Remove unused variable
Anastasia Stulova [Tue, 11 Jan 2022 13:45:33 +0000 (13:45 +0000)]
[SPIR-V] Remove unused variable

2 years ago[InstSimplify] Add additional GEP tests with undef bases.
Florian Hahn [Tue, 11 Jan 2022 13:43:53 +0000 (13:43 +0000)]
[InstSimplify] Add additional GEP tests with undef bases.

2 years ago[lldb] Remove non address bits from memory read arguments
David Spickett [Wed, 3 Nov 2021 12:10:40 +0000 (12:10 +0000)]
[lldb] Remove non address bits from memory read arguments

Addresses on AArch64 can have top byte tags, memory tags and pointer
authentication signatures in the upper bits.

While testing memory tagging I found that memory read couldn't
read a range if the two addresses had different tags. The same
could apply to signed pointers given the right circumstance.

(lldb) memory read mte_buf_alt_tag mte_buf+16
error: end address (0x900fffff7ff8010) must be greater than the start
address (0xa00fffff7ff8000).

Or it would try to read a lot more memory than expected.

(lldb) memory read mte_buf mte_buf_alt_tag+16
error: Normally, 'memory read' will not read over 1024 bytes of data.
error: Please use --force to override this restriction just once.
error: or set target.max-memory-read-size if you will often need a
larger limit.

Fix this by removing non address bits before we calculate the read
range. A test is added for AArch64 Linux that confirms this by using
the top byte ignore feature.

This means that if you do read with a tagged pointer the output
does not include those tags. This is potentially confusing but I think
overall it's better that we don't pretend that we're reading memory
from a range that the process is unable to map.

(lldb) p ptr1
(char *) $4 = 0x3400fffffffff140 "\x80\xf1\xff\xff\xff\xff"
(lldb) p ptr2
(char *) $5 = 0x5600fffffffff140 "\x80\xf1\xff\xff\xff\xff"
(lldb) memory read ptr1 ptr2+16
0xfffffffff140: 80 f1 ff ff ff ff 00 00 38 70 bc f7 ff ff 00 00  ........8p......

Reviewed By: omjavaid, danielkiss

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

2 years ago[SPIR-V] Add linking using spirv-link.
Anastasia Stulova [Tue, 11 Jan 2022 11:21:30 +0000 (11:21 +0000)]
[SPIR-V] Add linking using spirv-link.

Add support of linking files compiled into SPIR-V objects
using spirv-link.

Command line inteface examples:

clang --target=spirv64 test1.cl test2.cl

clang  --target=spirv64 test1.cl -o test1.o
clang  --target=spirv64 test1.o test2.cl -o test_app.out

This works independently from the SPIR-V generation method
(via an external tool or an internal backend) and applies
to either approach that is being used.

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

2 years ago[lldb/qemu] Implement GetMmapArgumentList
Pavel Labath [Mon, 10 Jan 2022 15:34:39 +0000 (16:34 +0100)]
[lldb/qemu] Implement GetMmapArgumentList

By forwarding it to the host platform.

2 years ago[SCEV] Reenable umin_seq support and fix the `computeSCEVAtScope()`
Roman Lebedev [Tue, 11 Jan 2022 12:51:43 +0000 (15:51 +0300)]
[SCEV] Reenable umin_seq support and fix the `computeSCEVAtScope()`

This reverts commit f62f47f5e1f641b41d3b7d593c058ebec2883534.

2 years ago[NFC][SCEV] Add reproducers for umin_seq crashes
Roman Lebedev [Tue, 11 Jan 2022 12:33:53 +0000 (15:33 +0300)]
[NFC][SCEV] Add reproducers for umin_seq crashes

As reported in https://reviews.llvm.org/D116766#3233042

2 years ago[LSR] Use pointer args instead of undef for uglygep*.ll tests.
Florian Hahn [Tue, 11 Jan 2022 12:35:55 +0000 (12:35 +0000)]
[LSR] Use pointer args instead of undef for uglygep*.ll tests.

Make the test more robust by replacing undef by pointer arguments. This
ensures that the GEPs cannot be folded to undef.

2 years agoRevert "[Clang][AArch64][ARM] PMUv3.4 Option Added"
David Green [Tue, 11 Jan 2022 12:33:53 +0000 (12:33 +0000)]
Revert "[Clang][AArch64][ARM] PMUv3.4 Option Added"

It turns out this is conflating a few different PMU extensions. And on
Arm ended up breaking M-Profile code generation. Reverting for the
moment whilst we sort out the details.

This reverts commit d17fb46e894501568a1bf3b11a5d920817444630.

2 years ago[Clang][Sema] Fix attribute mismatch warning for ObjC class properties
Egor Zhdan [Wed, 29 Dec 2021 22:02:21 +0000 (22:02 +0000)]
[Clang][Sema] Fix attribute mismatch warning for ObjC class properties

If a class declares an instance property, and an inheritor class declares a class property with the same name, Clang Sema currently treats the latter as an overridden property, and compares the attributes of the two properties to check for a mismatch. The resulting diagnostics might be misleading, since neither of the properties actually overrides the another one.

rdar://86018435

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

2 years ago[CodeGen] Avoid deprecated Address constructor
Nikita Popov [Tue, 11 Jan 2022 12:01:28 +0000 (13:01 +0100)]
[CodeGen] Avoid deprecated Address constructor

2 years ago[SVE][CodeGen] Use splice instruction when lowering VECTOR_SPLICE
David Sherwood [Thu, 16 Dec 2021 08:57:18 +0000 (08:57 +0000)]
[SVE][CodeGen] Use splice instruction when lowering VECTOR_SPLICE

For certain negative indices passed to the VECTOR_SPLICE operation
we can actually directly use the SVE splice instruction by creating
the appropriate predicate. The predicate needs to be constructed in
such a way that all but the last -idx elements are false. We can do
this efficiently using a combination of 'ptrue' (with the appropriate
fixed pattern, e.g. vl1, vl2, etc.) and 'rev'. The advantage of using
these instructions to generate the predicate is they do not set any
flags, unlike the whilelo instruction. This is critical when the splice
operation is in a loop, since we want MachineLICM to hoist the
predicate generation out of the loop.

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

2 years agoARM: make FastISel & GISel pass -1 to ADJCALLSTACKUP to signal no callee pop.
Tim Northover [Fri, 7 Jan 2022 13:49:18 +0000 (13:49 +0000)]
ARM: make FastISel & GISel pass -1 to ADJCALLSTACKUP to signal no callee pop.

The interface for these instructions changed with support for mandatory tail
calls, and now -1 indicates the CalleePopAmount argument is not valid.
Unfortunately I didn't realise FastISel or GISel did calls at the time so
didn't update them.

2 years ago[SemaTemplateInstantiate] Use cast<> instead of dyn_cast<> to avoid dereference of...
Simon Pilgrim [Tue, 11 Jan 2022 11:12:12 +0000 (11:12 +0000)]
[SemaTemplateInstantiate] Use cast<> instead of dyn_cast<> to avoid dereference of nullptr

The pointer is always dereferenced immediately below, so assert the cast is correct instead of returning nullptr

2 years ago[MemoryBuiltins] Remove unused isOpNewLikeFn() (NFC)
Nikita Popov [Tue, 11 Jan 2022 11:27:23 +0000 (12:27 +0100)]
[MemoryBuiltins] Remove unused isOpNewLikeFn() (NFC)

This function is no longer used since
2cafbcb560d9e6e2300941d088e754b01d56595b.

2 years ago[MemoryBuiltins] Remove unused isStrdupLikeFn() function (NFC)
Nikita Popov [Tue, 11 Jan 2022 11:25:39 +0000 (12:25 +0100)]
[MemoryBuiltins] Remove unused isStrdupLikeFn() function (NFC)

This function is no longer used after
dcbc91f40c2e6ff578667020f7c6a05c25149865.

2 years ago[DSE] Check for noalias calls rather than alloc functions
Nikita Popov [Tue, 11 Jan 2022 11:08:44 +0000 (12:08 +0100)]
[DSE] Check for noalias calls rather than alloc functions

For these "visible on unwind/ret" checks we only care about the
fact that no other code has access to the pointer (unless it
escapes). A noalias call is sufficient for this, it does not
have to be a known allocation function.

This is basically the same change as D116728, but for DSE rather
than LICM.