Commit Graph

25004 Commits

Author SHA1 Message Date
Kristina Brooks
9f47370eb8 [DebugInfo] Fix build when std::vector::iterator is a pointer
std::vector::iterator type may be a pointer, then
iterator::value_type fails to compile since iterator is not a class,
namespace, or enumeration.

Patch by orivej (Orivej Desh)

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



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342354 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-16 22:21:59 +00:00
Sanjay Patel
9d4952d6a5 [DAGCombiner] try to convert pow(x, 1/3) to cbrt(x)
This is a follow-up suggested in D51630 and originally proposed as an IR transform in D49040.

Copying the motivational statement by @evandro from that patch:
"This transformation helps some benchmarks in SPEC CPU2000 and CPU2006, such as 188.ammp, 
447.dealII, 453.povray, and especially 300.twolf, as well as some proprietary benchmarks. 
Otherwise, no regressions on x86-64 or A64."

I'm proposing to add only the minimum support for a DAG node here. Since we don't have an 
LLVM IR intrinsic for cbrt, and there are no other DAG ways to create a FCBRT node yet, I 
don't think we need to worry about DAG builder, legalization, a strict variant, etc. We 
should be able to expand as needed when adding more functionality/transforms. For reference, 
these are transform suggestions currently listed in SimplifyLibCalls.cpp:

//   * cbrt(expN(X))  -> expN(x/3)
//   * cbrt(sqrt(x))  -> pow(x,1/6)
//   * cbrt(cbrt(x))  -> pow(x,1/9)

Also, given that we bail out on long double for now, there should not be any logical 
differences between platforms (unless there's some platform out there that has pow()
but not cbrt()).

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342348 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-16 16:50:26 +00:00
Vedant Kumar
bfa7594241 [CodeGenPrepare] Preserve debug locs in OptimizeExtractBits
CodeGenPrepare has a transform that sinks {lshr, trunc} pairs to make it
easier for the backend to emit fancy extract-bits instructions (e.g UBFX).

Teach it to preserve debug locations and salvage debug values.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342319 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-15 04:08:52 +00:00
Craig Topper
6b3512c9ff [BreakFalseDeps] Fix bad formatting. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342293 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 22:26:09 +00:00
Reid Kleckner
a87575ecca [codeview] Remove dead code
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342285 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 21:14:08 +00:00
Reid Kleckner
388e636afb Revert r342183 "[DAGCombine] Fix crash when store merging created an extract_subvector with invalid index."
Causes 'isVector() && "Invalid vector type!"' assertion when building
Skia in Chrome.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342265 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 19:39:40 +00:00
Adrian Prantl
f09790fa1e Fix debug info for SelectionDAG legalization of DAG nodes with two results.
This patch fixes the debug info handling for SelectionDAG legalization
of DAG nodes with two results. When an replaced SDNode has more than
one result, transferDbgValues was always copying the SDDbgValue from
the first result and attaching them to all members. In reality
SelectionDAG::ReplaceAllUsesWith() is given an array of SDNodes
(though the type signature doesn't make this obvious (cf. the call
site code in ReplaceNode()).

rdar://problem/44162227

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342264 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 19:38:45 +00:00
Adrian Prantl
71e86497f4 fix noasserts build
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342247 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 17:32:52 +00:00
Adrian Prantl
b804bf5cf4 SelectionDAG: Add compact SDDbgValue representation to -dag-dump-verbose output
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342245 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 17:08:02 +00:00
Adrian Prantl
6764b4552f fix typos
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342241 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-14 16:12:14 +00:00
Amara Emerson
21390db360 [DAGCombine] Fix crash when store merging created an extract_subvector with invalid index.
Differential Revision: https://reviews.llvm.org/D51831

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342183 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-13 21:28:58 +00:00
Craig Topper
ee5f4639a8 [MachineInstr] In addRegisterKilled and addRegisterDead, don't remove operands from inline assembly instructions if they have an associated flag operand.
INLINEASM instructions use extra operands to carry flags. If a register operand is removed without removing the flag operand, then the flags will no longer make sense.

This patch fixes this by preventing the removal when a flag operand is present.

The included test case was generated by MS inline assembly. Longer term maybe we should fix the inline assembly parsing to not generate redundant operands.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342176 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-13 20:51:27 +00:00
Matt Arsenault
21339d63b9 DAG: Fix expansion of unaligned FP loads and stores
This was trying to scalarizing a scalar FP type,
resulting in an assert.

Fixes unaligned f64 stack stores for AMDGPU.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342132 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-13 12:14:23 +00:00
Tim Northover
29369e8ff6 ARM: align loops to 4 bytes on Cortex-M3 and Cortex-M4.
The Technical Reference Manuals for these two CPUs state that branching
to an unaligned 32-bit instruction incurs an extra pipeline reload
penalty. That's bad.

This also enables the optimization at -Os since it costs on average one
byte per loop in return for 1 cycle per iteration, which is pretty good
going.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342127 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-13 10:28:05 +00:00
Sanjay Patel
3478d12268 [DAGCombiner] improve formatting for select+setcc code; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342095 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-12 23:03:50 +00:00
David Green
b2cbb982a6 [CGP] Ensure splitgep gives deterministic output
The output of splitLargeGEPOffsets does not appear to be deterministic because
of the way that we iterate over a DenseMap. I've changed it to a MapVector for
consistent output.

The test here isn't particularly great, only showing a consmetic difference in
output. The original reproducer is much larger but show a diffierence in
instruction ordering, leading to different codegen.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342043 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-12 10:19:10 +00:00
Craig Topper
a212024885 [SelectionDAG] Remove some code from PromoteIntOp_MGATHER that handles UpdateNodeOperands returning an existing node instead of updating.
I suspect this became unecessary when the CSE of mgather was fixed in r338080. It may still be possible to hit this if we widen the element type of a gather outside of type legalization and the promote the mask of a separate gather node so they become the same. But that seems pretty unlikely.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342022 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-12 05:25:41 +00:00
Jessica Paquette
4301152612 [MachineOutliner] Add codegen size remarks to the MachineOutliner
Since the outliner is a module pass, it doesn't get codegen size remarks like
the other codegen passes do. This adds size remarks *to* the outliner.

This is kind of a workaround, so it's peppered with FIXMEs; size remarks
really ought to not ever be handled by the pass itself. However, since the
outliner is the only "MachineModulePass", this works for now. Since the
entire purpose of the MachineOutliner is to produce code size savings, it
really ought to be included in codgen size remarks.

If we ever go ahead and make a MachineModulePass (say, something similar to
MachineFunctionPass), then all of this ought to be moved there.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342009 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-11 23:05:34 +00:00
Michael Berg
87d1f822bf add IR flags to MI
Summary: Initial support for nsw, nuw and exact flags in MI

Reviewers: spatel, hfinkel, wristow

Reviewed By: spatel

Subscribers: nlopes

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341996 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-11 21:35:32 +00:00
Josh Stone
3ed903a204 [GlobalISel] Lower dbg.declare into indirect DBG_VALUE
Summary:
D31439 changed the semantics of dbg.declare to take the address of a
variable as the first argument, making it indirect.  It specifically
updated FastISel for this change here:

https://reviews.llvm.org/D31439#change-WVArzi177jPl

GlobalISel needs to follow suit, or else it will be missing a level of
indirection in the generated debuginfo.  This problem was seen in a Rust
debuginfo test on aarch64, since GlobalISel is used at -O0 for aarch64.

https://github.com/rust-lang/rust/issues/49807
https://bugzilla.redhat.com/show_bug.cgi?id=1611597
https://bugzilla.redhat.com/show_bug.cgi?id=1625768

Reviewers: dblaikie, aprantl, t.p.northover, javed.absar, rnk

Reviewed By: rnk

Subscribers: #debug-info, rovka, kristof.beyls, JDevlieghere, llvm-commits, tstellar

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341969 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-11 17:52:01 +00:00
Jessica Paquette
3aac0132d0 [MachineOutliner][NFC] Factor out instruction mapping into its own function
Just some tidy-up. Pull the mapper stuff into `populateMapper`. This makes it
a bit easier to read what's going on in `runOnModule`.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341959 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-11 16:33:46 +00:00
Jessica Paquette
3ec8365490 Add size remarks to MachineFunctionPass
This adds per-function size remarks to codegen, similar to what we have in the
IR layer as of r341588. This only impacts MachineFunctionPasses.

This does the same thing, but for `MachineInstr`s instead of just
`Instructions`. After this, when a `MachineFunctionPass` modifies the number of
`MachineInstr`s in the function it ran on, you'll get a remark.

To enable this, use the size-info analysis remark as before.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341876 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-10 22:24:10 +00:00
Benjamin Kramer
3ebb2159ed Don't create a temporary vector of loop blocks just to iterate over them.
Loop's getBlocks returns an ArrayRef.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341821 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-10 12:32:06 +00:00
Matt Arsenault
2390ffbd78 DAG: Handle odd vector sizes in calling conv splitting
This already worked if only one register piece was used,
but didn't if a type was split into multiple, unequal
sized pieces.

Fixes not splitting 3i16/v3f16 into two registers for
AMDGPU.

This will also allow fixing the ABI for 16-bit vectors
in a future commit so that it's the same for all subtargets.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341801 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-10 11:49:23 +00:00
Sanjay Patel
250785bc7b [SelectionDAG] enhance vector demanded elements to look at a vector select condition operand
This is the DAG equivalent of D51433.
If we know we're not using all vector lanes, use that knowledge to potentially simplify a vselect condition.

The reduction/horizontal tests show that we are eliminating AVX1 operations on the upper half of 256-bit 
vectors because we don't need those anyway.
I'm not sure what the pr34592 test is showing. That's run with -O0; is SimplifyDemandedVectorElts supposed 
to be running there?

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341762 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-09 14:13:22 +00:00
Fangrui Song
35bfd59001 Fix typos. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341740 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-08 02:04:20 +00:00
Adrian Prantl
90c166c4e5 Remove addBlockByrefAddress(), it is dead code as far as clang is concerned.
This patch removes addBlockByrefAddress(), it is dead code as far as
clang is concerned: Every byref block capture is emitted with a
complex expression that is equivalent to what this function does.

rdar://problem/31629055

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341737 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-08 00:21:55 +00:00
Reid Kleckner
443a8ce3c6 [COFF] Implement llvm.global_ctors priorities for MSVC COFF targets
Summary:
MSVC and LLD sort sections ASCII-betically, so we need to use section
names that sort between .CRT$XCA (the start) and .CRT$XCU (the default
priority).

In the general case, use .CRT$XCT12345 as the section name, and let the
linker sort the zero-padded digits.

Users with low priorities typically want to initialize as early as
possible, so use .CRT$XCA00199 for prioties less than 200. This number
is arbitrary.

Implements PR38552.

Reviewers: majnemer, mstorsjo

Subscribers: hiraditya, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341727 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-07 23:07:55 +00:00
David Stenberg
66586cc1b5 [DebugInfo] Handle stack slot offsets for spilled sub-registers in LDV
Summary:
Extend LDV so that stack slot offsets for spilled sub-registers
are added to the emitted debug locations. This is accomplished
by querying InstrInfo::getStackSlotRange().

With this change, LDV will add a DW_OP_plus_uconst operation to
the expression if a sub-register is spilled. Later on, PEI will
add an offset operation for the stack slot, meaning that we will
get expressions of the forms:

 * {DW_OP_constu #fp-offset, DW_OP_minus,
    DW_OP_plus_uconst #subreg-offset}

 * {DW_OP_plus_const #fp-offset,
    DW_OP_minus, DW_OP_plus_uconst #subreg-offset}

The two offset operations should ideally be merged.

Reviewers: rnk, aprantl, stoklund

Reviewed By: aprantl

Subscribers: dblaikie, bjope, nemanjai, JDevlieghere, llvm-commits

Tags: #debug-info

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341659 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-07 13:54:07 +00:00
Simon Pilgrim
e14a443a2b [DAGCombiner] foldBitcastedFPLogic - Add basic vector support
Add support for bitcasts from float type to an integer type of the same element bitwidth.

There maybe cases where we need to support different widths (e.g. as SSE __m128i is treated as v2i64) - but I haven't seen cases of this in the wild yet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341652 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-07 12:13:45 +00:00
Sven van Haastregt
b219bbc863 Fix argument type in MachineInstr::hasPropertyInBundle
The MCID::Flag enumeration now has more than 32 items, this means that
the hasPropertyBundle argument 'Mask' can overflow.

This patch changes the argument to be 64 bits instead.

Patch by Mikael Nilsson.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341536 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-06 10:25:59 +00:00
Hsiangkai Wang
799544783a [DebugInfo] Do not generate label debug info if it has been processed.
In DwarfDebug::collectEntityInfo(), if the label entity is processed in
DbgLabels list, it means the label is not optimized out. There is no
need to generate debug info for it with null position.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341513 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-06 02:22:06 +00:00
Sanjay Patel
39f79ecf00 [DAGCombiner] try to convert pow(x, 0.25) to sqrt(sqrt(x))
This was proposed as an IR transform in D49306, but it was not clearly justifiable as a canonicalization. 
Here, we only do the transform when the target tells us that sqrt can be lowered with inline code.

This is the basic case. Some potential enhancements are in the TODO comments:

1. Generalize the transform for other exponents (allow more than 2 sqrt calcs if that's really cheaper).
2. If we have less fast-math-flags, generate code to avoid -0.0 and/or INF.
3. Allow the transform when optimizing/minimizing size (might require a target hook to get that right).

Note that by default, x86 converts single-precision sqrt calcs into sqrt reciprocal estimate with 
refinement. That codegen is controlled by CPU attributes and can be manually overridden. We have plenty 
of test coverage for that already, so I didn't bother to include extra testing for that here. AArch uses 
its full-precision ops in all cases (not sure if that's the intended behavior or not, but that should 
also be covered by existing tests).

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341481 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-05 17:01:56 +00:00
Jonas Devlieghere
846d4ba893 [DebugInfo] Normalize common kinds of DWARF sub-expressions.
Normalize common kinds of DWARF sub-expressions to make debug info
encoding a bit more compact:

  DW_OP_constu [X < 32] -> DW_OP_litX
  DW_OP_constu [all ones] -> DW_OP_lit0, DW_OP_not (64-bit only)

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341457 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-05 10:18:36 +00:00
Sander de Smalen
7336954a4d Remove FrameAccess struct from hasLoadFromStackSlot
This removes the FrameAccess struct that was added to the interface
in D51537, since the PseudoValue from the MachineMemoryOperand
can be safely casted to a FixedStackPseudoSourceValue.

Reviewers: MatzeB, thegameg, javed.absar

Reviewed By: thegameg

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341454 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-05 08:59:50 +00:00
Hsiangkai Wang
10377f6858 [DebugInfo] Fix bug in LiveDebugVariables.
In lib/CodeGen/LiveDebugVariables.cpp, it uses std::prev(MBBI) to
get DebugValue's SlotIndex. However, the previous instruction may be
also a debug instruction. It could not use a debug instruction to query
SlotIndex in mi2iMap.

Scan all debug instructions and use the first debug instruction to query
SlotIndex for following debug instructions. Only handle DBG_VALUE in
handleDebugValue().

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341446 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-05 05:58:53 +00:00
Matt Arsenault
87877c5043 DAG: Factor out helper function for odd vector sizes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341392 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-04 18:47:43 +00:00
Scott Linder
c7d9aac718 [CodeGen] Fix remaining zext() assertions in SelectionDAG
Fix remaining cases not committed in https://reviews.llvm.org/D49574

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341380 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-04 16:33:34 +00:00
Matt Arsenault
24b52d3cc6 DAG: Handle extract_vector_elt in isKnownNeverNaN
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341317 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-03 14:01:03 +00:00
Sander de Smalen
67bd0d9a0f Fix issue introduced by r341301 that broke buildbot.
A condition in isSpillInstruction() updates a small vector rather
than the 'FI' by-ref parameter, which was used in a subsequent
call to 'isSpillSlotObjectIndex()'. This patch fixes the condition
to check the FIs in the vector instead.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341305 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-03 10:23:34 +00:00
Sander de Smalen
1d40abd282 Extend hasStoreToStackSlot with list of FI accesses.
For instructions that spill/fill to and from multiple frame-indices
in a single instruction, hasStoreToStackSlot and hasLoadFromStackSlot
should return an array of accesses, rather than just the first encounter
of such an access.

This better describes FI accesses for AArch64 (paired) LDP/STP
instructions.

Reviewers: t.p.northover, gberry, thegameg, rengolin, javed.absar, MatzeB

Reviewed By: MatzeB

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341301 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-03 09:15:58 +00:00
Hsiangkai Wang
e39c39b6ec Revert "[DebugInfo] Fix bug in LiveDebugVariables."
This reverts commit 8f548ff2a1819e1bc051e8218584f1a3d2cf178a.

buildbot failure in LLVM on clang-ppc64be-linux
http://lab.llvm.org:8011/builders/clang-ppc64le-linux/builds/19765

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341290 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-02 16:35:42 +00:00
Hsiangkai Wang
27ea31c8ee [DebugInfo] Fix bug in LiveDebugVariables.
In lib/CodeGen/LiveDebugVariables.cpp, it uses std::prev(MBBI) to
get DebugValue's SlotIndex. However, the previous instruction may be
also a debug instruction. It could not use a debug instruction to query
SlotIndex in mi2iMap.

Scan all debug instructions and use the first debug instruction to query
SlotIndex for following debug instructions. Only handle DBG_VALUE in
handleDebugValue().

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341289 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-02 15:57:22 +00:00
Roman Lebedev
41b17bcd0d [DAGCombine] optimizeSetCCOfSignedTruncationCheck(): handle inverted pattern
Summary:
A follow-up for D49266 / rL337166 + D49497 / rL338044.

This is still the same pattern to check for the [lack of]
signed truncation, but in this case the constants and the predicate
are negated.

https://rise4fun.com/Alive/BDV
https://rise4fun.com/Alive/n7Z

Reviewers: spatel, craig.topper, RKSimon, javed.absar, efriedma, dmgreen

Reviewed By: spatel

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341287 91177308-0d34-0410-b5e6-96231b3b80d8
2018-09-02 13:56:22 +00:00
Vlad Tsyrklevich
033d7590b1 SafeStack: Prevent OOB reads with mem intrinsics
Summary:
Currently, the SafeStack analysis disallows out-of-bounds writes but not
out-of-bounds reads for mem intrinsics like llvm.memcpy. This could
cause leaks of pointers to the safe stack by leaking spilled registers/
frame pointers. Check for allocas used as source or destination pointers
to mem intrinsics.

Reviewers: eugenis

Reviewed By: eugenis

Subscribers: pcc, llvm-commits, kcc

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341116 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 20:44:51 +00:00
Craig Topper
0ea3261482 [DAGCombiner] Fix bad identation. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341103 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 19:35:40 +00:00
Vladimir Stefanovic
a32d403fb6 Allow inconsistent offsets for 'noreturn' basic blocks when '-verify-cfiinstrs'
With r295105, some 'noreturn' blocks (those that don't return and have no
successors) may be merged.
If such blocks' predecessors have different outgoing offset or register, don't
report an error in CFIInstrInserter verify().

Thanks to Vlad Tsyrklevich for reporting the issue.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341087 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 17:31:38 +00:00
Nicolai Haehnle
b33a403240 [NFC] Rename the DivergenceAnalysis to LegacyDivergenceAnalysis
Summary:
This is patch 1 of the new DivergenceAnalysis (https://reviews.llvm.org/D50433).

The purpose of this patch is to free up the name DivergenceAnalysis for the new generic
implementation. The generic implementation class will be shared by specialized
divergence analysis classes.

Patch by: Simon Moll

Reviewed By: nhaehnle

Subscribers: jvesely, jholewinski, arsenm, nhaehnle, mgorny, jfb, llvm-commits

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

Change-Id: Ie8146b11be2c50d5312f30e11c7a3036a15b48cb

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341071 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 14:21:36 +00:00
Ties Stuij
6089d1a3c7 [CodeGen] emit inline asm clobber list warnings for reserved (cont)
Summary:
This is a continuation of https://reviews.llvm.org/D49727
Below the original text, current changes in the comments:

Currently, in line with GCC, when specifying reserved registers like sp or pc on an inline asm() clobber list, we don't always preserve the original value across the statement. And in general, overwriting reserved registers can have surprising results.

For example:

  extern int bar(int[]);
  
  int foo(int i) {
    int a[i]; // VLA
    asm volatile(
        "mov r7, #1"
      :
      :
      : "r7"
    );
  
    return 1 + bar(a);
  }

Compiled for thumb, this gives:

  $ clang --target=arm-arm-none-eabi -march=armv7a -c test.c -o - -S -O1 -mthumb
  ...
  foo:
          .fnstart
  @ %bb.0:                                @ %entry
          .save   {r4, r5, r6, r7, lr}
          push    {r4, r5, r6, r7, lr}
          .setfp  r7, sp, #12
          add     r7, sp, #12
          .pad    #4
          sub     sp, #4
          movs    r1, #7
          add.w   r0, r1, r0, lsl #2
          bic     r0, r0, #7
          sub.w   r0, sp, r0
          mov     sp, r0
          @APP
          mov.w   r7, #1
          @NO_APP
          bl      bar
          adds    r0, #1
          sub.w   r4, r7, #12
          mov     sp, r4
          pop     {r4, r5, r6, r7, pc}
  ...

r7 is used as the frame pointer for thumb targets, and this function needs to restore the SP from the FP because of the variable-length stack allocation a. r7 is clobbered by the inline assembly (and r7 is included in the clobber list), but LLVM does not preserve the value of the frame pointer across the assembly block.

This type of behavior is similar to GCC's and has been discussed on the bugtracker: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11807 . No consensus seemed to have been reached on the way forward. Clang behavior has briefly been discussed on the CFE mailing (starting here: http://lists.llvm.org/pipermail/cfe-dev/2018-July/058392.html). I've opted for following Eli Friedman's advice to print warnings when there are reserved registers on the clobber list so as not to diverge from GCC behavior for now.

The patch uses MachineRegisterInfo's target-specific knowledge of reserved registers, just before we convert the inline asm string in the AsmPrinter.

If we find a reserved register, we print a warning:

  repro.c:6:7: warning: inline asm clobber list contains reserved registers: R7 [-Winline-asm]
        "mov r7, #1"
        ^

Reviewers: efriedma, olista01, javed.absar

Reviewed By: efriedma

Subscribers: eraman, kristof.beyls, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341062 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 12:52:35 +00:00
Matt Arsenault
da1abaaf13 Don't count debug instructions towards neighborhood count
In computeRegisterLiveness, the max instructions to search
was counting dbg_value instructions, which could potentially
cause an observable codegen change from the presence of debug
info.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341028 91177308-0d34-0410-b5e6-96231b3b80d8
2018-08-30 07:18:19 +00:00