19988 Commits

Author SHA1 Message Date
Quentin Colombet
30880b6d80 [GlobalISel] Get rid of the ifdefs in TargetLowering.
Introduce a new API used only by GlobalISel: CallLowering.
This API will contain target hooks dedicated to call lowering.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260922 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 00:57:44 +00:00
Zia Ansari
5ed116b04b Implemented stack symbol table ordering/packing optimization to improve data locality and code size from SP/FP offset encoding.
Differential Revision: http://reviews.llvm.org/D15393



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260917 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-15 23:44:13 +00:00
Matthias Braun
372250bdfb LiveIntervalAnalysis: Support moving of subregister defs in handleMove
This is an updated version which fixes a bug that happened with
uses tied to an earlyclobber operand which end at an unusual slotindex.

If two definitions write to independent subregisters then they can be
put in any order. LiveIntervalAnalysis::handleMove() did not support
this previously because it looks like moving a definition of a vreg past
another one.

This is a modified version of a patch proposed (two years ago) by
Vincent Lejeune! This version does not touch the read-undef flags and is
extended for the case of moving a subregister def behind all uses - this
can happen for subregister defs that are completely unused.

Differential Revision: http://reviews.llvm.org/D9067

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260906 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-15 19:25:36 +00:00
Matthias Braun
2168cf4b1b MachineVerifier: Add parameter to choose if MachineFunction::verify() aborts
The abort on error behaviour is unpractical for debugger and unittest
usage.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260904 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-15 19:25:31 +00:00
Ahmed Bougacha
606927f7bb [CodeGen] Document and use getConstant's splat-building feature. NFC.
Differential Revision: http://reviews.llvm.org/D17229

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260901 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-15 18:07:29 +00:00
Jonas Paulsson
d7ffe9a12e [ScheduleDAGInstrs] isUnsafeMemoryObject() removed
This function was basically useless, since volatile memacesses or MIs with
unmodelled sideffects become global memory objects, and the other little
checks are also done elsewhere.

Reviewed by Andy Trick
http://reviews.llvm.org/D16881

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260899 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-15 16:43:15 +00:00
Benjamin Kramer
8d6707c823 [AggressiveAntiDepBreaker] Skip some unnecessary BitVector copies.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260825 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-13 16:39:39 +00:00
Matthias Braun
7eaa93aa2b LiveIntervalAnalysis: Remove LiveVariables requirement
This requirement was a huge hack to keep LiveVariables alive because it
was optionally used by TwoAddressInstructionPass and PHIElimination.
However we have AnalysisUsage::addUsedIfAvailable() which we can use in
those passes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260806 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-13 04:35:31 +00:00
Pirama Arumuga Nainar
d313df118a Don't combine fp_round (fp_round x) if f80 to f16 is generated
Summary:
This patch skips DAG combine of fp_round (fp_round x) if it results in
an fp_round from f80 to f16.

fp_round from f80 to f16 always generates an expensive (and as yet,
unimplemented) libcall to __truncxfhf2.  This prevents selection of
native f16 conversion instructions from f32 or f64.  Moreover, the first
(value-preserving) fp_round from f80 to either f32 or f64 may become a
NOP in platforms like x86.

Reviewers: ab

Subscribers: srhines, llvm-commits

Differential Revision: http://reviews.llvm.org/D17221

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260769 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-13 00:08:05 +00:00
Reid Kleckner
43c4ddff1c [codeview] Describe local variables in registers
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260746 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 21:48:30 +00:00
Andrew Kaylor
4caa75fcde [WinEH] Prevent EH state numbering from skipping nested cleanup pads that never return
Differential Revision: http://reviews.llvm.org/D17208



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260733 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 21:10:16 +00:00
Quentin Colombet
2e463eaffd Get rid of some GLOBAL_ISEL ifdefs that should be harmless for code size.
More to come, but those were easy.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260723 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 20:41:24 +00:00
Mehdi Amini
32bf97b2b6 GlobalISel is always built since r260566, reflect it in LLVMBuild.txt
Other component could not depends on an optional library in llvm-config

From: Mehdi Amini <mehdi.amini@apple.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260701 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 18:43:14 +00:00
Quentin Colombet
08e5258565 [IRTranslator] Use a single virtual register to represent any Value.
PR26161.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260602 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 21:48:32 +00:00
Quentin Colombet
6b6079747f [Target] Add a helper function to check if an opcode is invalid after isel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260590 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 21:16:56 +00:00
Matthias Braun
e7d57e326e Revert "LiveIntervalAnalysis: Support moving of subregister defs in handleMove"
This is broke a bot:

http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/4703/steps/test-suite/logs/test.log

Reverting while I investigate.

This reverts commit r260565.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260586 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 21:07:44 +00:00
Sanjay Patel
a52e2127b6 [SelectionDAG] change getConstant() to use the input SDLoc when building splat vectors
The code change is simple enough: instead of attaching an anonymous SDLoc to splatted
vector constants, use the scalar constant's existing SDLoc since that is what is passed 
into getConstant() as a param. But this changes instruction scheduling, so I'll explain
why that happens.

The motivation for this patch starts near:
http://reviews.llvm.org/rL258833
...x86's getZeroVector() could be similarly cleaned up and I thought it would be 'NFC'.
But when I made that change locally, several x86 codegen tests wiggled.

It turns out that the lack of SDLoc consistency in getConstant() changes the way 
ScheduleDAGRRList behaves. This is because the SDLoc contains 'IROrder' and some DAG
scheduler algorithms use IROrder for tie-breaking.

Differential Revision: http://reviews.llvm.org/D16972



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260582 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 20:21:24 +00:00
Quentin Colombet
0cd715129e [GlobalISel] Add the necessary plumbing to lower formal arguments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260579 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:59:41 +00:00
Peter Collingbourne
cb4440633e DwarfDebug: emit type units immediately.
Rather than storing type units in a vector and emitting them at the end
of code generation, emit them immediately and destroy them, reclaiming the
memory we were using for their DIEs.

In one benchmark carried out against Chromium's 50 largest (by bitcode
file size) translation units, total peak memory consumption with type units
decreased by median 17%, or by 7% when compared against disabling type units.

Tested using check-{llvm,clang}, the GDB 7.5 test suite (with
'-fdebug-types-section') and by eyeballing llvm-dwarfdump output on those
Chromium translation units with split DWARF both disabled and enabled, and
verifying that the only changes were to addresses and abbreviation ordering.

Differential Revision: http://reviews.llvm.org/D17118

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260578 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:57:46 +00:00
Reid Kleckner
6d97a8c749 [codeview] Fix bug around multi-level wrapper inlining
If there were wrapper functions with no instructions of their own in the
inlining tree, we would fail to emit InlineSite records for them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260571 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:41:47 +00:00
Quentin Colombet
3f0151fdc6 Play nice with Visual Studio and attributes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260568 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:33:21 +00:00
Quentin Colombet
317e76f08d [CMake] Produce an empty library for GlobalISel when not building it.
The rational for this change is that LLVMBuild cannot express conditional 
dependencies. Therefore, when we start optionally using GlobalISel library for 
say AArch64, without that change, all the tools that use the AArch64 library 
would need to explicitly link with GlobalISel when we ask for it.

This does not scale.

Instead, we will set the dependencies between the target and GlobalISel and if 
we did not ask to build GlobalISel, the library will just be empty.

Thanks to Chris Bieneman and Mehdi Animi for the idea.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260566 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:18:27 +00:00
Matthias Braun
07b147db30 LiveIntervalAnalysis: Support moving of subregister defs in handleMove
If two definitions write to independent subregisters then they can be
put in any order. LiveIntervalAnalysis::handleMove() did not support
this previously because it looks like moving a definition of a vreg past
another one.

This is a modified version of a patch proposed (two years ago) by
Vincent Lejeune! This version does not touch the read-undef flags and is
extended for the case of moving a subregister def behind all uses - this
can happen for subregister defs that are completely unused.

Differential Revision: http://reviews.llvm.org/D9067

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260565 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 19:03:53 +00:00
Quentin Colombet
ad5520eac9 [GlobalISel] Teach the IRTranslator how to lower returns.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260562 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 18:53:28 +00:00
Quentin Colombet
7f77b29db7 [GlobalISel] Add a type to MachineInstr.
We actually need that information only for generic instructions, therefore it
would be nice not to have to pay the extra memory consumption for all
instructions. Especially because a typed non-generic instruction does not make
sense.

The question is then, is it possible to have that information in a union or
something?
My initial thought was that we could have a derived class GenericMachineInstr
with additional information, but in practice it makes little to no sense since
generic MachineInstrs are likely turned into non-generic ones by just switching
the opcode. In other words, we don't want to go through the process of creating
a new, non-generic MachineInstr, object each time we do this switch. The memory
benefit probably is not worth the extra compile time.

Another option would be to keep the type of the MachineInstr in a side table.
This would induce an extra indirection though.

Anyway, I will file a PR to discuss about it and remember we need to come back
to it at some point.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260558 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 18:22:37 +00:00
Quentin Colombet
b5d0611e18 [GlobalISel] Add a hook in TargetConfigPass to run GlobalISel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260553 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 17:57:22 +00:00
Quentin Colombet
fa09f54ecd [GlobalISel][IRTranslator] Change the ownership of the MIRBuilder field.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260551 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 17:53:23 +00:00
Quentin Colombet
c778da675d [GlobalISel][IRTranslator] Fix a typo in assert.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260550 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 17:52:28 +00:00
Quentin Colombet
bbbe03f0d3 [GlobalISel][IRTranslator] Teach the pass how to translate Add instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260549 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 17:51:31 +00:00
Quentin Colombet
eb096dc0d4 [GlobalISel] Add a MachineIRBuilder class.
Helper class to build machine instrs. This is a higher abstraction
than MachineInstrBuilder.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260547 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 17:44:59 +00:00
Benjamin Kramer
a25f0be03b Drop the hidden visibility from DebugHandlerBase for now.
If a class has hidden visibility all derived classes and all classes
that have it as a member must have hidden visibility too. That may
be fixable here but requires changes to quite a lot of debug info
classes.

This is also one of the things that GCC enforces aggressively while
clang ignores it, making testing more annoying than necessary.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260529 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 15:41:56 +00:00
Quentin Colombet
30335031a5 [GlobalISel][MachineRegisterInfo] Add a method to create generic vregs.
For now, generic virtual registers will not have a register class. We may want
to change that. For instance, if we want to use all the methods from
TargetRegisterInfo with generic virtual registers, we need to either have some
sort of generic register classes that do what we want, or teach those methods
how to deal with nullptr register class.

Although the latter seems easy enough to do, we may still want to differenciate
generic register classes from nullptr to catch cases where nullptr gets
introduced by a bug of some sort.

Anyway, I will file a PR to keep track of that.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260474 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 00:19:17 +00:00
Quentin Colombet
d3bd0e5e8b [GlobalISel] Remember the size of generic virtual registers
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260468 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 23:43:48 +00:00
Quentin Colombet
f62b31051b [GlobalISel] More detailed skeleton for the IRTranslator.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260456 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 22:59:27 +00:00
Reid Kleckner
430dfb18e5 [codeview] Describe int local variables using .cv_def_range
Summary:
Refactor common value, scope, and label tracking logic out of DwarfDebug
into a common base class called DebugHandlerBase.

Update an old LLVM IR test case to avoid an assertion in LexicalScopes.

Reviewers: dblaikie, majnemer

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D16931

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260432 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 20:55:49 +00:00
Ahmed Bougacha
3248c624fa [CodeGen] Prefer "if (SDValue R = ...)" to "if (R.getNode())". NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260316 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-09 22:54:12 +00:00
Sanjay Patel
068c0ce5f1 [SelectionDAG] make getMemBasePlusOffset() accessible; NFCI
I reinvented this functionality in http://reviews.llvm.org/D16828 because it was
hidden away as a static function. The changes in x86 are not based on a complete
audit. I suspect there are other possible uses there, and there are almost certainly
more potential users in other targets.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260295 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-09 21:42:04 +00:00
Andrew Kaylor
fb2b3b0bed [regalloc][WinEH] Do not mark intervals as not spillable if they contain a regmask
Differential Revision: http://reviews.llvm.org/D16831



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260164 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 22:52:51 +00:00
Hans Wennborg
7dfc3433f3 [X86] Don't zero/sign-extend i1, i8, or i16 return values to 32 bits (PR22532)
This matches GCC and MSVC's behaviour, and saves on code size.

We were already not extending i1 return values on x86_64 after r127766. This
takes that patch further by applying it to x86 target as well, and also for i8
and i16.

The ABI docs have been unclear about the required behaviour here. The new i386
psABI [1] clearly states (Table 2.4, page 14) that i1, i8, and i16 return
vales do not need to be extended beyond 8 bits. The x86_64 ABI doc is being
updated to say the same [2].

Differential Revision: http://reviews.llvm.org/D16907

 [1]. https://01.org/sites/default/files/file_attach/intel386-psabi-1.0.pdf
 [2]. https://groups.google.com/d/msg/x86-64-abi/E8O33onbnGQ/_RFWw_ixDQAJ

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260133 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 19:34:30 +00:00
Matt Arsenault
98d69cc318 SelectionDAG: Lower some range metadata to AssertZext
If a range has a lower bound of 0, add an AssertZext from the
nearest floor power of two.

This allows operations with some workitem intrinsics with known
maximum ranges to use fast 24-bit multiplies.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260109 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 16:28:19 +00:00
Sanjoy Das
0ba13f53fe [StatepointLower] Use None instead of Optional<int>()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259956 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-05 23:40:04 +00:00
Wei Mi
f2ca031646 Some stackslots are allocated to vregs which have no real reference.
LiveRangeEdit::eliminateDeadDef is used to remove dead define instructions
after rematerialization. To remove a VNI for a vreg from its LiveInterval,
LiveIntervals::removeVRegDefAt is used. However, after non-PHI VNIs are all
removed, PHI VNI are still left in the LiveInterval. Such unused vregs will
be kept in RegsToSpill[] at the end of InlineSpiller::reMaterializeAll and
spiller will allocate stackslot for them.

The fix is to get rid of unused reg by checking whether it has non-dbg
reference instead of whether it has non-empty interval.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259895 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-05 18:14:24 +00:00
Matt Arsenault
4b9655d7ac Fix printing of f16 machine operands
Only single and double FP immediates are correctly printed by
MachineInstr::print() during debug output. Half float type goes to
APFloat::convertToDouble() and hits assertion it is not a double
semantics. This diff prints half machine operands correctly.

This cannot currently be hit by any in-tree target.

Patch by Stanislav Mekhanoshin

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259857 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-05 00:50:18 +00:00
Nemanja Ivanovic
60f6cd1467 Enable the %s modifier in inline asm template string
This patch corresponds to review:
http://reviews.llvm.org/D16847

There are some files in glibc that use the output operand modifier even though
it was deprecated in GCC. This patch just adds support for it to prevent issues
with such files.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259798 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-04 16:18:08 +00:00
Petar Jovanovic
8ed0526e77 [Power PC] softening long double type
This patch implements softening of long double type (ppcf128) on ppc32
architecture and enables operations for this type for soft float.

Patch by Strahinja Petrovic.

Differential Revision: http://reviews.llvm.org/D15811


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259791 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-04 14:43:50 +00:00
Jonas Paulsson
ebc5f75de7 [ScheduleDagInstrs] Improved comments
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259783 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-04 13:08:48 +00:00
Sanjay Patel
4b77eeb789 rangify; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259722 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-03 22:44:14 +00:00
Reid Kleckner
6741ccc7ca [codeview] Remove EmitLabelDiff in favor emitAbsoluteSymbolDiff
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259700 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-03 21:24:42 +00:00
Reid Kleckner
0495e3ce8d [codeview] Use the MCStreamer interface directly instead of AsmPrinter
This is mostly about having shorter lines and standardizing on one
interface, but it also avoids some needless indirection.

No functional change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259697 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-03 21:15:48 +00:00
Keno Fischer
7119b269cd [DWARFDebug] Fix another case of overlapping ranges
Summary:
In r257979, I added code to ensure that we wouldn't merge DebugLocEntries if
the pieces they describe overlap. Unfortunately, I failed to cover the case,
where there may have multiple active Expressions in the entry, in which case we
need to make sure that no two values overlap before we can perform the merge.

This fixed PR26148.

Reviewers: aprantl
Differential Revision: http://reviews.llvm.org/D16742

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259696 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-03 21:13:33 +00:00