]> granicus.if.org Git - llvm/commitdiff
[X86] Limit the 'x' inline assembly constraint to zmm0-15 when used for a 512 type.
authorCraig Topper <craig.topper@intel.com>
Mon, 15 Apr 2019 21:06:32 +0000 (21:06 +0000)
committerCraig Topper <craig.topper@intel.com>
Mon, 15 Apr 2019 21:06:32 +0000 (21:06 +0000)
The 'v' constraint is used to select zmm0-31. This makes 512 bit consistent with 128/256-bit.a

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358450 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.td
test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll [new file with mode: 0644]

index 514df8ccc090e631b8f66d161428d08b71015fe2..6464b8ee0655696c2acfe6afb21e2f286647ae99 100644 (file)
@@ -43730,7 +43730,9 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
       case MVT::v16f32:
       case MVT::v16i32:
       case MVT::v8i64:
-        return std::make_pair(0U, &X86::VR512RegClass);
+        if (VConstraint)
+          return std::make_pair(0U, &X86::VR512RegClass);
+        return std::make_pair(0U, &X86::VR512_0_15RegClass);
       }
       break;
     }
index 9f5f22b56101d14f8de1f263f630f8304b9541e3..7dec87cdcb03302128cb1342224d3f1012b60fa8 100644 (file)
@@ -163,6 +163,7 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
     case X86::RFP32RegClassID:
     case X86::RFP64RegClassID:
     case X86::RFP80RegClassID:
+    case X86::VR512_0_15RegClassID:
     case X86::VR512RegClassID:
       // Don't return a super-class that would shrink the spill size.
       // That can happen with the vector and float classes.
index e03f0492cd77e0a5b308368c5f8b7fae1bcd11a2..c0acff9c8c3ec38d97cbe26eb95ace00758b0f46 100644 (file)
@@ -570,6 +570,10 @@ def DFCCR : RegisterClass<"X86", [i32], 32, (add DF)> {
 def VR512 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64],
                           512, (sequence "ZMM%u", 0, 31)>;
 
+// Represents the lower 16 registers that have VEX/legacy encodable subregs.
+def VR512_0_15 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64],
+                               512, (sequence "ZMM%u", 0, 15)>;
+
 // Scalar AVX-512 floating point registers.
 def FR32X : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 31)>;
 
diff --git a/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll b/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll
new file mode 100644 (file)
index 0000000..2f711a8
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f -stop-after=expand-isel-pseudos | FileCheck %s
+
+; CHECK: %[[REG1:.*]]:vr512_0_15 = COPY %1
+; CHECK: %[[REG2:.*]]:vr512_0_15 = COPY %2
+; CHECK: INLINEASM &"vpaddq\09$3, $2, $0 {$1}", 0, 7340042, def %{{.*}}, 1179657, %{{.*}}, 7340041, %[[REG1]], 7340041, %[[REG2]], 12, implicit-def early-clobber $df, 12, implicit-def early-clobber $fpsw, 12, implicit-def early-clobber $eflags
+define <8 x i64> @mask_Yk_i8(i8 signext %msk, <8 x i64> %x, <8 x i64> %y) {
+entry:
+  %0 = tail call <8 x i64> asm "vpaddq\09$3, $2, $0 {$1}", "=x,^Yk,x,x,~{dirflag},~{fpsr},~{flags}"(i8 %msk, <8 x i64> %x, <8 x i64> %y)
+  ret <8 x i64> %0
+}