[llvm] r361843 - [X86-64] Fix 256-bit SET0 lowering for non-VLX targets

David Greene via llvm-commits llvm-commits at lists.llvm.org
Tue May 28 08:37:02 PDT 2019


Author: greened
Date: Tue May 28 08:37:01 2019
New Revision: 361843

URL: http://llvm.org/viewvc/llvm-project?rev=361843&view=rev
Log:
[X86-64] Fix 256-bit SET0 lowering for non-VLX targets

If we don't have VLX then 256-bit SET0 should be lowered
to VPXOR with ZMM registers.  This restores functionality
accidentally removed by r309926.

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

Added:
    llvm/trunk/test/CodeGen/X86/avx512f-256-set0.mir
Modified:
    llvm/trunk/lib/Target/X86/X86InstrInfo.cpp

Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=361843&r1=361842&r2=361843&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue May 28 08:37:01 2019
@@ -3932,6 +3932,12 @@ bool X86InstrInfo::expandPostRAPseudo(Ma
       MIB.addReg(SrcReg, RegState::ImplicitDefine);
       return true;
     }
+    if (MI.getOpcode() == X86::AVX512_256_SET0) {
+      // No VLX so we must reference a zmm.
+      unsigned ZReg =
+        TRI->getMatchingSuperReg(SrcReg, X86::sub_ymm, &X86::VR512RegClass);
+      MIB->getOperand(0).setReg(ZReg);
+    }
     return Expand2AddrUndef(MIB, get(X86::VPXORDZrr));
   }
   case X86::V_SETALLONES:

Added: llvm/trunk/test/CodeGen/X86/avx512f-256-set0.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512f-256-set0.mir?rev=361843&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/avx512f-256-set0.mir (added)
+++ llvm/trunk/test/CodeGen/X86/avx512f-256-set0.mir Tue May 28 08:37:01 2019
@@ -0,0 +1,66 @@
+# Test that we emit VPXORD with ZMM registers instead of YMM
+# registers when we do not have VLX.
+#
+# RUN: llc -mtriple=x86_64-- -mattr=+avx512f -o - %s | FileCheck %s
+# CHECK: vpxord %zmm16, %zmm16, %zmm16
+--- |
+  ; ModuleID = 'test.ll'
+  source_filename = "test.ll"
+  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+  target triple = "x86_64-unknown-linux-gnu"
+
+  @tst_ = common global [4 x i64] zeroinitializer, align 64
+
+  define void @main() #0 {
+  bb0:
+    %gep1 = bitcast [4 x i64]* @tst_ to [4 x i64]*
+    %lsr.iv1 = bitcast [4 x i64]* %gep1 to <4 x i64>*
+    store <4 x i64> zeroinitializer, <4 x i64>* %lsr.iv1, align 16
+    ret void
+  }
+
+  attributes #0 = { "target-features"="+avx512f" }
+
+...
+---
+name:            main
+alignment:       4
+exposesReturnsTwice: false
+legalized:       false
+regBankSelected: false
+selected:        false
+failedISel:      false
+tracksRegLiveness: true
+hasWinCFI:       false
+registers:       []
+liveins:         []
+frameInfo:
+  isFrameAddressTaken: false
+  isReturnAddressTaken: false
+  hasStackMap:     false
+  hasPatchPoint:   false
+  stackSize:       0
+  offsetAdjustment: 0
+  maxAlignment:    0
+  adjustsStack:    false
+  hasCalls:        false
+  stackProtector:  ''
+  maxCallFrameSize: 0
+  cvBytesOfCalleeSavedRegisters: 0
+  hasOpaqueSPAdjustment: false
+  hasVAStart:      false
+  hasMustTailInVarArgFunc: false
+  localFrameSize:  0
+  savePoint:       ''
+  restorePoint:    ''
+fixedStack:      []
+stack:           []
+constants:       []
+machineFunctionInfo: {}
+body:             |
+  bb.0.bb0:
+    renamable $ymm16 = AVX512_256_SET0
+    VMOVAPSZmr $rip, 1, $noreg, @tst_, $noreg, killed renamable $zmm16 :: (store 32 into %ir.lsr.iv1, align 64)
+    RET 0
+
+...




More information about the llvm-commits mailing list