diff options
author | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-28 09:18:47 +0000 |
---|---|---|
committer | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-28 09:18:47 +0000 |
commit | 46e07e362303a8b0c06651ab5bd71255aa8b16dc (patch) | |
tree | 0065600892b8717b6b2c383c388bddb5787e9a2e /llvm/lib/Target/X86/X86LegalizerInfo.cpp | |
parent | 212e67619a227a513d8a915f04d3e8c23967853c (diff) | |
download | bcm5719-llvm-46e07e362303a8b0c06651ab5bd71255aa8b16dc.tar.gz bcm5719-llvm-46e07e362303a8b0c06651ab5bd71255aa8b16dc.zip |
[GlobalIsel][X86] Support G_PTRTOINT instruction.
Add legalization/selection for x86/x86_64 and
corresponding tests.
Reviewed By: igorb
Differential Revision: https://reviews.llvm.org/D43617
llvm-svn: 326311
Diffstat (limited to 'llvm/lib/Target/X86/X86LegalizerInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86LegalizerInfo.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/X86LegalizerInfo.cpp index 56a096b0d44..050e5ef8b29 100644 --- a/llvm/lib/Target/X86/X86LegalizerInfo.cpp +++ b/llvm/lib/Target/X86/X86LegalizerInfo.cpp @@ -124,6 +124,12 @@ void X86LegalizerInfo::setLegalizerInfo32bit() { setAction({G_GEP, p0}, Legal); setAction({G_GEP, 1, s32}, Legal); + if (!Subtarget.is64Bit()) + getActionDefinitionsBuilder(G_PTRTOINT) + .legalForCartesianProduct({s1, s8, s16, s32}, {p0}) + .maxScalar(0, s32) + .widenScalarToNextPow2(0, /*Min*/ 8); + // Control-flow setAction({G_BRCOND, s1}, Legal); @@ -161,6 +167,11 @@ void X86LegalizerInfo::setLegalizerInfo64bit() { if (!Subtarget.is64Bit()) return; + const LLT p0 = LLT::pointer(0, TM.getPointerSize() * 8); + const LLT s1 = LLT::scalar(1); + const LLT s8 = LLT::scalar(8); + const LLT s16 = LLT::scalar(16); + const LLT s32 = LLT::scalar(32); const LLT s64 = LLT::scalar(64); const LLT s128 = LLT::scalar(128); @@ -179,6 +190,10 @@ void X86LegalizerInfo::setLegalizerInfo64bit() { // Pointer-handling setAction({G_GEP, 1, s64}, Legal); + getActionDefinitionsBuilder(G_PTRTOINT) + .legalForCartesianProduct({s1, s8, s16, s32, s64}, {p0}) + .maxScalar(0, s64) + .widenScalarToNextPow2(0, /*Min*/ 8); // Constants setAction({TargetOpcode::G_CONSTANT, s64}, Legal); |