[llvm] r305816 - AMDGPU: Preserve undef when folding register operands

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 20 11:41:31 PDT 2017


Author: arsenm
Date: Tue Jun 20 13:41:31 2017
New Revision: 305816

URL: http://llvm.org/viewvc/llvm-project?rev=305816&view=rev
Log:
AMDGPU: Preserve undef when folding register operands

If the source was a copy of an undef register, this would
produce a read of an undefined register which is a verifier
error.

Modified:
    llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp
    llvm/trunk/test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir

Modified: llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp?rev=305816&r1=305815&r2=305816&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp Tue Jun 20 13:41:31 2017
@@ -166,6 +166,8 @@ static bool updateOperand(FoldCandidate
   if (TargetRegisterInfo::isVirtualRegister(Old.getReg()) &&
       TargetRegisterInfo::isVirtualRegister(New->getReg())) {
     Old.substVirtReg(New->getReg(), New->getSubReg(), TRI);
+
+    Old.setIsUndef(New->isUndef());
     return true;
   }
 

Modified: llvm/trunk/test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir?rev=305816&r1=305815&r2=305816&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir Tue Jun 20 13:41:31 2017
@@ -864,16 +864,22 @@ body:             |
 # There is only an undef use operand for %1, so there is no
 # corresponding defining instruction
 
+# GCN-LABEL: name: undefined_vreg_operand{{$}}
+# GCN: bb.0
+# GCN-NEXT: FLAT_STORE_DWORD undef %3, undef %1,
+# GCN-NEXT: S_ENDPGM
 name: undefined_vreg_operand
 tracksRegLiveness: true
 registers:
   - { id: 0, class: vgpr_32, preferred-register: '' }
   - { id: 1, class: vgpr_32, preferred-register: '' }
   - { id: 2, class: vgpr_32, preferred-register: '' }
+  - { id: 3, class: vreg_64, preferred-register: '' }
 body:             |
   bb.0:
     %0 = V_MOV_B32_e32 0, implicit %exec
     %2 = V_XOR_B32_e64 killed %0, undef %1, implicit %exec
+    FLAT_STORE_DWORD undef %3, %2, 0, 0, 0, implicit %exec, implicit %flat_scr
     S_ENDPGM
 
 ...




More information about the llvm-commits mailing list