24 Commits

Author SHA1 Message Date
Tim Northover
2c87ca8a0e GlobalISel: restrict G_EXTRACT instruction to just one operand.
A bit more painful than G_INSERT because it was more widely used, but this
should simplify the handling of extract operations in most locations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297100 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-06 23:50:28 +00:00
Diana Picus
de6b1270fb [ARM] GlobalISel: Select 32-bit G_CONSTANT
Put it into a register by means of a MOVi.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296471 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-28 13:05:42 +00:00
Diana Picus
77b493ab59 [ARM] GlobalISel: Select G_GEP
At this point, G_GEP is just an add, so we treat it exactly like a G_ADD.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296462 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-28 10:14:38 +00:00
Diana Picus
27abbacf66 [ARM] GlobalISel: Select G_STORE
Same as selecting G_LOAD.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296122 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-24 14:01:27 +00:00
Diana Picus
3ef378f103 [ARM] GlobalISel: Don't select atomic loads
There used to be a check in the IRTranslator that prevented us from having to
deal with atomic loads/stores. That check has been removed in r294993 and the
AArch64 backend was updated accordingly. This commit does the same thing for the
ARM backend.

In general, in the ARM backend we introduce fences during the atomic expand
pass, so we don't have to worry about atomics, *except* for the 32-bit ARMv8
target, which handles atomics more like AArch64. Since we don't want to worry
about that yet, just bail out of instruction selection if we find any atomic
loads.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295662 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-20 14:45:58 +00:00
Diana Picus
35af78a713 [ARM] GlobalISel: Clean up some helpers
Return invalid opcodes when some of the helpers in the instruction selection
pass can't handle a given combination.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295446 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-17 13:44:19 +00:00
Diana Picus
f3d4a249cc [ARM] GlobalISel: Select floating point loads
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295321 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-16 14:10:50 +00:00
Diana Picus
0c9edc1bdb [ARM] GlobalISel: Select G_SEQUENCE and G_EXTRACT
Since they're only used for passing around double precision floating point
values into the general purpose registers, we'll lower them to VMOVDRR and
VMOVRRD.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295310 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-16 12:19:57 +00:00
Diana Picus
126f155f7f [ARM] GlobalISel: Select double G_FADD and copies
Just use VADDD if available, bail out if not.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295309 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-16 12:19:52 +00:00
Diana Picus
bb65a8b75f [ARM] GlobalISel: Add FPR reg bank
Add a register bank for floating point values and select simple instructions
using them (add, copies from GPR).

This assumes that the hardware can cope with a single precision add (VADDS)
instruction, so the legalizer will treat G_FADD as legal and the instruction
selector will refuse to select if the hardware doesn't support it. In the future
we'll want to be more careful about this, and legalize to libcalls if we have to
use soft float.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294442 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-08 13:23:04 +00:00
Diana Picus
4cead7216b [ARM] GlobalISel: Load i1, i8 and i16 args from stack
Add support for loading i1, i8 and i16 arguments from the stack, with or without
the ABI extension flags.

When the ABI extension flags are present, we load a 4-byte value, otherwise we
preserve the size of the load and let the instruction selector replace it with a
LDRB/LDRH. This generates the same thing as DAGISel.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293163 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 09:20:47 +00:00
Martin Bohme
e46e519345 [ARM] GlobalISel: Fix stack-use-after-scope bug.
Summary:
Lifetime extension wasn't triggered on the result of BuildMI because the
reference was non-const. However, instead of adding a const, I've
removed the reference entirely as RVO should kick in anyway.

Reviewers: rovka, bkramer

Reviewed By: bkramer

Subscribers: aemerson, rengolin, dberris, llvm-commits, kristof.beyls

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293059 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 14:28:19 +00:00
Diana Picus
6bed410085 [ARM] GlobalISel: Support i1 add and ABI extensions
Add support for:
* i1 add
* i1 function arguments, if passed through registers
* i1 returns, with ABI signext/zeroext

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293035 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 08:47:40 +00:00
Diana Picus
c3d81fb16c [ARM] GlobalISel: Support i8/i16 ABI extensions
At the moment, this means supporting the signext/zeroext attribute on the return
type of the function. For function arguments, signext/zeroext should be handled
by the caller, so there's nothing for us to do until we start lowering calls.

Note that this does not include support for other extensions (i8 to i16), those
will be added later.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293034 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 08:10:40 +00:00
Diana Picus
1279248fc3 [ARM] CodeGen: Remove AddDefaultCC. NFC.
Replace all uses of AddDefaultCC with add(condCodeOp()).
The transformation has been done automatically with a custom tool based on Clang
AST Matchers + RefactoringTool.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291893 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-13 10:18:01 +00:00
Diana Picus
0aacbaa851 [ARM] CodeGen: Remove AddDefaultPred. NFC.
Replace all uses of AddDefaultPred with MachineInstrBuilder::add(predOps()).
This makes the code building MachineInstrs more readable, because it allows us
to write code like:

MIB.addSomeOperand(blah)
   .add(predOps())
   .addAnotherOperand(blahblah)

instead of

AddDefaultPred(MIB.addSomeOperand(blah))
    .addAnotherOperand(blahblah)

This commit also adds the predOps helper in the ARM backend, as well as the add
method taking a variable number of operands to the MachineInstrBuilder.

The transformation has been done mostly automatically with a custom tool based
on Clang AST Matchers + RefactoringTool.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291890 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-13 09:37:56 +00:00
Daniel Jasper
d6878955b8 Silence unused warning.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290109 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 14:24:22 +00:00
Diana Picus
f2838d8814 [ARM] GlobalISel: Select i8 and i16 copies
Teach the instruction selector that it's ok to copy small values from physical
registers.

First part of https://reviews.llvm.org/D27704

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290104 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 14:07:50 +00:00
Diana Picus
abc24acb9f [ARM] GlobalISel: Support loading from the stack
Add support for selecting simple G_LOAD and G_FRAME_INDEX instructions (32-bit
scalars only). This will be useful for functions that need to pass arguments on
the stack.

First part of https://reviews.llvm.org/D27195.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290096 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 11:26:31 +00:00
Benjamin Kramer
df71b60812 [GlobalISel] Silence unused variable warnings in Release builds.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289941 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-16 13:13:03 +00:00
Diana Picus
b1879fb1fb [ARM] GlobalISel: Select add i32, i32
Add the minimal support necessary to select a function that returns the sum of
two i32 values.

This includes some support for argument/return lowering of i32 values through
registers, as well as the handling of copy and add instructions throughout the
GlobalISel pipeline.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289940 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-16 12:54:46 +00:00
Tim Northover
7e53cdde40 GlobalISel: remove unused variable to silence warning.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287027 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-15 21:06:07 +00:00
Diana Picus
2e14486c47 [ARM] GlobalISel: Remove unused members. NFCI
This silences some warnings that I didn't see with my host compiler.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286981 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-15 16:42:10 +00:00
Diana Picus
286599a8f9 [ARM] Add plumbing for GlobalISel
Add GlobalISel skeleton, up to the point where we can select a ret void.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286573 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-11 08:27:37 +00:00