Commit Graph

24124 Commits

Author SHA1 Message Date
Craig Topper de866c328a [DAGCombiner] Add two calls to isVector before making calls to getVectorElementType/getVectorNumElements to avoid an assert.
We looked through a BITCAST, but the bitcast might be a from a scalar type rather than a vector.

I don't have a test case. I stumbled onto it while prototyping another change that isn't ready yet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325750 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-22 07:05:27 +00:00
Lang Hames 2e9f926ca0 [PBQP] Fix PR33038 by pruning empty intervals in initializeGraph.
Spilling may cause previously non-empty intervals (both for the spilled vreg
and others) to become empty. Moving the pruning into initializeGraph catches
these cases and fixes PR33038.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325632 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 22:15:09 +00:00
Craig Topper 6a9e037dc7 [SelectionDAG] Support known true/false SimplifySetCC cases for comparing against vector splats of constants.
This is split off from D42948 and includes just the cases that constant fold to true or false. It also includes some refactoring to keep predicate checks together.

This supports things like

(setcc uge X, 0) -> true

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325627 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 21:48:14 +00:00
Craig Topper bff6449bb8 [SelectionDAG] Add LegalTypes flag to getShiftAmountTy. Use it to unify and simplify DAGCombiner and simplifySetCC code and fix a bug.
DAGCombiner and SimplifySetCC both use getPointerTy for shift amounts pre-legalization. DAGCombiner uses a single helper function to hide this. SimplifySetCC does it in multiple places.

This patch adds a defaulted parameter to getShiftAmountTy that can make it return getPointerTy for scalar types. Use this parameter to simplify the SimplifySetCC and DAGCombiner.

Additionally, there were two places in SimplifySetCC that were creating shifts using the target's preferred shift amount pre-legalization. If the target uses a narrow type and the type is illegal, this can cause SimplfiySetCC to create a shift with an amount that can't represent all possible shift values for the type. To fix this we should use pointer type there too.

Alternatively we could make getScalarShiftAmountTy for each target return a safe value for large types as proposed in D43445. And maybe we should still do that, but fixing the SimplifySetCC code keeps other targets from tripping over this in the future.

Fixes PR36250.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325602 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 17:41:05 +00:00
Alexey Bataev 196883612a [DEBUGINFO] Add support for emission of the inlined strings.
Summary:
Patch adds an option for emission of inlined strings rather than
.debug_str section.

Reviewers: echristo, jlebar

Subscribers: eraman, llvm-commits, JDevlieghere

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325583 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 15:28:08 +00:00
Simon Pilgrim c9d87a17ca [VectorLegalizer] Fix uint64_t typo in ExpandUINT_TO_FLOAT (PR36391)
ExpandUINT_TO_FLOAT can accept vXi32 or vXi64 inputs, so we need to use a uint64_t shift to generate the 2^(BW/2) constant.

No test case unfortunately as no upstream target uses this, but its affecting a downstream target.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325578 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 13:24:24 +00:00
Serge Pavlov 06c71d8a6f Report fatal error in the case of out of memory
This is the second part of recommit of r325224. The previous part was
committed in r325426, which deals with C++ memory allocation. Solution
for C memory allocation involved functions `llvm::malloc` and similar.
This was a fragile solution because it caused ambiguity errors in some
cases. In this commit the new functions have names like `llvm::safe_malloc`.

The relevant part of original comment is below, updated for new function
names.

Analysis of fails in the case of out of memory errors can be tricky on
Windows. Such error emerges at the point where memory allocation function
fails, but manifests itself when null pointer is used. These two points
may be distant from each other. Besides, next runs may not exhibit
allocation error.

In some cases memory is allocated by a call to some of C allocation
functions, malloc, calloc and realloc. They are used for interoperability
with C code, when allocated object has variable size and when it is
necessary to avoid call of constructors. In many calls the result is not
checked for null pointer. To simplify checks, new functions are defined
in the namespace 'llvm': `safe_malloc`, `safe_calloc` and `safe_realloc`.
They behave as corresponding standard functions but produce fatal error if
allocation fails. This change replaces the standard functions like 'malloc'
in the cases when the result of the allocation function is not checked
for null pointer.

Finally, there are plain C code, that uses malloc and similar functions. If
the result is not checked, assert statement is added.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325551 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-20 05:41:26 +00:00
Simon Pilgrim 176cbb368e [SelectionDAG] ComputeKnownBits - add support for SMIN+SMAX clamp patterns
If we have a clamp pattern, SMIN(SMAX(X, LO),HI) or SMAX(SMIN(X, HI),LO) then we can deduce that the number of signbits (zeros/ones) will be at least the minimum of the LO and HI constants.

ComputeKnownBits equivalent of D43338.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325521 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-19 18:08:16 +00:00
Pavel Labath b64767750b [CodeGen] Refactor AppleAccelTable
Summary:
This commit separates the abstract accelerator table data structure
from the code for writing out an on-disk representation of a specific
accelerator table format. The idea is that former (now called
AccelTable<T>) can be reused for the DWARF v5 accelerator tables
as-is, without any further customizations.

Some bits of the emission code (now living in the EmissionContext class)
can be reused for DWARF v5 as well, but the subtle differences in the
layout of various subtables mean the sharing is not always possible.
(Also, the individual emit*** functions are fairly simple so there's a
tradeoff between making a bigger general-purpose function, and two
smaller targeted functions.)

Another advantage of this setup is that more of the serialization logic
can be hidden in the .cpp file -- I have moved declarations of the
header and all the emission functions there.

Reviewers: JDevlieghere, aprantl, probinson, dblaikie

Subscribers: echristo, clayborg, vleschuk, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325516 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-19 16:12:20 +00:00
Francis Visoiu Mistrih cf75fe0300 [CodeGen] Fix tests breaking after r325505
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325512 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-19 15:51:17 +00:00
Francis Visoiu Mistrih f751ac3a9c Revert "[CodeGen] Move printing '\n' from MachineInstr::print to MachineBasicBlock::print"
This reverts commit r324681.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325505 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-19 15:08:49 +00:00
Simon Pilgrim d76d550dc7 Fix Wparentheses warning. NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325451 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 22:45:56 +00:00
Simon Pilgrim 95e99979dc [SelectionDAG] ComputeNumSignBits - add support for SMIN+SMAX clamp patterns
If we have a clamp pattern, SMIN(SMAX(X, LO),HI) or SMAX(SMIN(X, HI),LO) then we can deduce that the number of signbits will be at least the minimum of the LO and HI constants.

I haven't bothered with the UMIN/UMAX equivalent as (1) we don't have any current use cases and (2) I wonder if we'd be better off immediately falling back for ComputeKnownBits for UMIN/UMAX which already has optimization patterns useful for unsigned cases.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325450 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 22:19:50 +00:00
Simon Pilgrim 8a630465fb [SelectionDAG] SimplifyDemandedVectorElts - add support for VECTOR_INSERT_ELT
Differential Revision: https://reviews.llvm.org/D43431

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325449 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 21:49:40 +00:00
Sander de Smalen 68a901a7ad [DebugInfo][FastISel] Fix dropping dbg.value()
Summary:
https://llvm.org/PR36263 shows that when compiling at -O0 a dbg.value()
instruction (that remains from an original dbg.declare()) is dropped
by FastISel. Since FastISel selects instructions by iterating a basic
block backwards, it drops the dbg.value if one of its operands is not
yet instantiated by a previously selected instruction.

Instead of calling 'lookUpRegForValue()' we can call 'getRegForValue()'
instead that will insert a placeholder for the operand to be filled in
when continuing the instruction selection.

Reviewers: aprantl, dblaikie, probinson

Reviewed By: aprantl

Subscribers: llvm-commits, dstenb, JDevlieghere

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325438 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 16:42:54 +00:00
Martin Storsjo 7c5411cd78 [AArch64] Implement dynamic stack probing for windows
This makes sure that alloca() function calls properly probe the
stack as needed.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325433 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 14:26:32 +00:00
Simon Pilgrim c26f626148 [DAGCombiner] Remove simplifyShuffleMask - now handled more generally by SimplifyDemandedVectorElts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325429 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 12:36:56 +00:00
Sander de Smalen ba9330b126 [DebugInfo] Removed assert on missing CountVarDIE
Summary:
The assert for a DISubrange's CountVarDIE to be available fails
when the dbg.value() has been optimized away for any reason.
Having the assert for that is a little heavy, so instead removing
it now in favor of not generating the 'count' expression.

Addresses http://llvm.org/PR36263 .

Reviewers: aprantl, dblaikie, probinson

Reviewed By: aprantl

Subscribers: JDevlieghere, llvm-commits, dstenb

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325427 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 11:06:53 +00:00
Quentin Colombet 0d9a8774c9 Revert "[MachineCopyPropagation] Extend pass to do COPY source forwarding"
This reverts commit r323991.

This commit breaks target that don't model all the register constraints
in TableGen. So far the workaround was to set the
hasExtraXXXRegAllocReq, but it proves that it doesn't cover all the
cases.
For instance, when mutating an instruction (like in the lowering of
COPYs) the isRenamable flag is not properly updated. The same problem
will happen when attaching machine operand from one instruction to
another.

Geoff Berry is working on a fix in https://reviews.llvm.org/D43042.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325421 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 03:05:33 +00:00
Chandler Carruth 20ea0e4c87 [DAG, X86] Revert r324797, r324491, and r324359.
Sadly, r324359 caused at least PR36312. There is a patch out for review
but it seems to be taking a bit and we've already had these crashers in
tree for too long. We're hitting this PR in real code now and are
blocked on shipping new compilers as a consequence so I'm reverting us
back to green.

Sorry for the churn due to the stacked changes that I had to revert. =/

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325420 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-17 02:26:25 +00:00
Simon Pilgrim d23faddc17 Fix signed/unsigned comparison warning. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325363 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-16 17:26:59 +00:00
Simon Pilgrim ce03445935 Fix signed/unsigned comparison warning. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325359 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-16 16:52:50 +00:00
Simon Pilgrim e0288d90cb [SelectionDAG] Enable SimplifyDemandedVectorElts support for simplifying shuffle masks
Based off the DemandedElts mask the and UNDEF elements returned from the SimplifyDemandedVectorElts calls to the shuffle operands, we can attempt to simplify the shuffle mask.

I had to be very conservative here as accepting post-legalized shuffle masks could cause problems for targets that legalize UNDEF mask elements back to inrange values (PowerPC), similarly combining to identity shuffle masks could cause too much UNDEF information to disappear for later combines.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325354 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-16 16:22:14 +00:00
Simon Pilgrim 7735c73357 [SelectionDAG] Add initial SimplifyDemandedVectorElts support for simplifying VSELECT operands
This just adds a basic pass through - we can add constant selection mask handling in a future patch to fully match InstCombine.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325338 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-16 12:21:08 +00:00
Mikhail Maltsev 053d9bfd93 [LegalizeDAG] Fix legalization of SETCC
Summary:
Currently when expanding a SETCC node into a SELECT_CC, LLVM uses
an incorrect type for determining BooleanContent of the result. This
patch fixes the issue.

Fixes PR36079.

Reviewers: rogfer01, javed.absar, efriedma

Reviewed By: efriedma

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325325 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-16 09:35:16 +00:00
Craig Topper 297d461b01 [DAGCombiner] Call ExtendUsesToFormExtLoad in (zext (and (load)))->(and (zextload)) even when the and does not have multiple uses
Same for the sign extend case.

Currently we check for multiple uses on the binop. Then we call ExtendUsesToFormExtLoad to capture SetCCs that use the load. So we only end up finding any setccs when the and has additional uses and the load is used by a setcc. I don't think the and having multiple uses is relevant here. I think we should only be checking for the load having multiple uses.

This changes an NVPTX test because we now find that the load has a second use by a truncate, but ExtendUsesToFormExtLoad only looks at setccs it can extend. All other operations just check isTruncateFree. Maybe we should allow widening of an existing truncate even if its not free?

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325289 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 20:20:32 +00:00
Francis Visoiu Mistrih e9184306cf [CodeGen] Separate MBB metadata from instructions in -debug printing
Add an empty line after 'liveins:', 'successors:', or '; predecessors:',
the one that ends up to be the last one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325258 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 16:23:59 +00:00
Simon Pilgrim 87eb10ac0c [SelectionDAG] Pull out repeated Op.getOpcode(). NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325253 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 15:31:00 +00:00
Francis Visoiu Mistrih 5ca0745329 [CodeGen] Print irreducible loop header weight as a MIR comment
Prefix it with '; ' to make it more MIR-compatible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325251 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 15:27:34 +00:00
Momchil Velikov 032b42a4b9 [DebugInfo] Accept enumeration types without underlying integer type present in
debug info metadata

... when generating DWARF.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325234 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 13:29:33 +00:00
Simon Pilgrim 371e6cc130 [SelectionDAG] Add initial implementation of TargetLowering::SimplifyDemandedVectorElts
This is mainly a move of simplifyShuffleOperands from DAGCombiner::visitVECTOR_SHUFFLE to create a more general purpose TargetLowering::SimplifyDemandedVectorElts implementation.

Further features can be moved/added in future patches.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325232 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 12:14:15 +00:00
Serge Pavlov 165fd931ac Revert r325224 "Report fatal error in the case of out of memory"
It caused fails on some buildbots.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325227 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 09:45:59 +00:00
Serge Pavlov ca451d02e4 Report fatal error in the case of out of memory
Analysis of fails in the case of out of memory errors can be tricky on
Windows. Such error emerges at the point where memory allocation function
fails, but manifests itself when null pointer is used. These two points
may be distant from each other. Besides, next runs may not exhibit
allocation error.

Usual programming practice does not require checking result of 'operator
new' because it throws 'std::bad_alloc' in the case of allocation error.
However, LLVM is usually built with exceptions turned off, so 'new' can
return null pointer. This change installs custom new handler, which causes
fatal error in the case of out of memory. The handler is installed
automatically prior to call to 'main' during construction of a static
object defined in 'lib/Support/ErrorHandling.cpp'. If the application does
not use this file, the handler may be installed manually by a call to
'llvm::install_out_of_memory_new_handler', declared in
'include/llvm/Support/ErrorHandling.h".

There are calls to C allocation functions, malloc, calloc and realloc.
They are used for interoperability with C code, when allocated object has
variable size and when it is necessary to avoid call of constructors. In
many calls the result is not checked against null pointer. To simplify
checks, new functions are defined in the namespace 'llvm' with the
same names as these C function. These functions produce fatal error if
allocation fails. User should use 'llvm::malloc' instead of 'std::malloc'
in order to use the safe variant. This change replaces 'std::malloc'
in the cases when the result of allocation function is not checked against
null pointer.

Finally, there are plain C code, that uses malloc and similar functions. If
the result is not checked, assert statements are added.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325224 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 09:20:26 +00:00
Andrew V. Tischenko 89b2bec4e0 (NFC)[MachineCombiner] Improve debug output.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325217 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-15 07:55:02 +00:00
Francis Visoiu Mistrih 4569bffc7a [CodeGen] Print predecessors, successors, then liveins in -debug printing
Reorder them to match MIR.

Predecessors are only comments, and they're not usually printed in MIR.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325166 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 20:23:05 +00:00
Volkan Keles 2d51ba3a29 GlobalISel: Add templated functions and pattern matcher support for some more opcodes
Summary:
This patch adds templated functions to MachineIRBuilder for some opcodes
and adds pattern matcher support for G_AND and G_OR.

Reviewers: aditya_nandakumar

Reviewed By: aditya_nandakumar

Subscribers: rovka, kristof.beyls, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325162 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 19:58:36 +00:00
Rafael Espindola 06d6207c1c Pass a reference to a module to the bitcode writer.
This simplifies most callers as they are already using references or
std::unique_ptr.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325155 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 19:11:32 +00:00
Craig Topper 9f9d3d9a03 [RegisterClassInfo] Invalidate the register pressure set limit cache when reserved regs or callee saved regs change
Previously we only invalidated the pressure set limit cached when the TargetRegisterInfo pointer changes. But as reserved regs and callee saved regs are used as part of calculating the limits we should invalidate when those change too.

I encountered this when reverting a patch from the 6.0 branch. One of the x86 test files had a function that used rbp as a frame pointer, making it reserved. It was followed by another function which didn't use rbp but had the same TRI so the pressure set limit cache was not invalidated. If i removed the function that used rbp as a frame pointer from the file, the remaining function then got a different register pressure limit for the GR16 pressure set. This caused the machine scheduler to change the scheduling for the function. This was an unexpected change from just deleting a function.

I don't have a test case for trunk because the particular x86 test case is different enough from the 6.0 branch to not be affected now.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325153 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 18:53:29 +00:00
Paul Robinson bcf26eacc0 [DWARF] Fix incorrect prologue end line record.
The prologue-end line record must be emitted after the last
instruction that is part of the function frame setup code and before
the instruction that marks the beginning of the function body.

Patch by Carlos Alberto Enciso!

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325143 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 17:35:52 +00:00
Alexander Ivchenko ba2e473a53 [SelectionDAG][X86] Fix incorrect offset generated for VMASKMOV
When creating high MachineMemOperand for MSTORE/MLOAD we supply
it with the original PointerInfo, while the pointer itself had been incremented.
The patch adds the proper offset to the PointerInfo.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325135 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 15:55:24 +00:00
Petar Jovanovic 4ef378ed28 [Utils] Salvage the debug info of DCE'ed 'and' instructions
Preserve debug info from a dead 'and' instruction with a constant.

Patch by Djordje Todorovic.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325119 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 13:10:35 +00:00
Elena Demikhovsky 8e229ec0e5 Adding a width of the GEP index to the Data Layout.
Making a width of GEP Index, which is used for address calculation, to be one of the pointer properties in the Data Layout.
p[address space]:size:memory_size:alignment:pref_alignment:index_size_in_bits.
The index size parameter is optional, if not specified, it is equal to the pointer size.

Till now, the InstCombiner normalized GEPs and extended the Index operand to the pointer width.
It works fine if you can convert pointer to integer for address calculation and all registered targets do this.
But some ISAs have very restricted instruction set for the pointer calculation. During discussions were desided to retrieve information for GEP index from the Data Layout.
http://lists.llvm.org/pipermail/llvm-dev/2018-January/120416.html

I added an interface to the Data Layout and I changed the InstCombiner and some other passes to take the Index width into account.
This change does not affect any in-tree target. I added tests to cover data layouts with explicitly specified index size.

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



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325102 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 06:58:08 +00:00
Craig Topper f71997e911 [SelectionDAG] Remove duplicate code from TargetLowering::SimplifySetCC.
This exact code already exists a little further up.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325101 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-14 06:51:57 +00:00
Daniel Sanders 747839c483 [globalisel][legalizerinfo] Follow up on post-commit review comments after r323681
* Document most API's
* Delete a useless function call
* Fix a discrepancy between the single and multi-opcode variants of
  getActionDefinitions().
  The multi-opcode variant now requires that more than one opcode is requested.
  Previously it acted much like the single-opcode form but unnecessarily
  enforced the requirements of the multi-opcode form.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325067 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 23:02:44 +00:00
Adrian Prantl 7c57f9ef8d Document the shortcomings of DwarfExpression::addMachineReg().
Also make a drive-by-fix of a bug in the subregister scan code that
only triggers with an incomplete or otherwise very irregular machine
description.

rdar://problem/37404493

This re-applies r324972 with an early exit in the case of a complete
failure to make this commit NFC again as intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325041 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 19:54:00 +00:00
Francis Visoiu Mistrih 3fa22fa403 [CodeGen] Print bundled instructions using the MIR syntax in -debug output
Old syntax:

BUNDLE implicit-def %r0, implicit-def %r1, implicit %r2
* %r0 = SOME_OP %r2
* %r1 = ANOTHER_OP internal %r0

New syntax:

BUNDLE implicit-def %r0, implicit-def %r1, implicit %r2 {
  %r0 = SOME_OP %r2
  %r1 = ANOTHER_OP internal %r0
}

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325032 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 18:08:26 +00:00
Craig Topper 7947e7211b [DAGCombiner] Add one use check to fold (not (and x, y)) -> (or (not x), (not y))
Summary:
If the and has an additional use we shouldn't invert it. That creates an additional instruction.

While there add a one use check to the transform above that looked similar.

Reviewers: spatel, RKSimon

Reviewed By: RKSimon

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325019 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 16:25:27 +00:00
Sanjay Patel 81540ce108 [DAG] fix type of undef returned by getNode()
The bug has been lying dormant, but apparently was never exposed, until
after rL324941 because we didn't return the correct result 
for shifts with undef operands.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325010 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 14:55:07 +00:00
Adrian Prantl 957c7c76d1 Revert "Document the shortcomings of DwarfExpression::addMachineReg()."
This reverts commit r324972. This commit broke a bot, so perhaps it is
testable after all?

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324977 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 01:17:35 +00:00
Vedant Kumar 2bbd73403b [Utils] Salvage debug info of DCE'ed mul/sdiv/srem instructions
Here are the number of additional debug values salvaged in a stage2
build of clang:

  63 SALVAGE: MUL
  1250 SALVAGE: SDIV

(No values were salvaged from `srem` instructions in this experiment,
but it's a simple case to handle so we might as well.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324976 91177308-0d34-0410-b5e6-96231b3b80d8
2018-02-13 01:09:52 +00:00