[llvm] r339056 - [X86] Fix assertion in subreg extraction

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 6 14:16:16 PDT 2018


Author: rnk
Date: Mon Aug  6 14:16:16 2018
New Revision: 339056

URL: http://llvm.org/viewvc/llvm-project?rev=339056&view=rev
Log:
[X86] Fix assertion in subreg extraction

This assert fires when attempting to extract a subregister from the
global PIC base register. This virtual register SD node is not in the
VRBaseMap, so we shouldn't call getVR to look it up there. If this is a
RegisterSDNode, we should be able to use the virtual register directly.

Fixes PR38385

Added:
    llvm/trunk/test/CodeGen/X86/large-pic-string.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=339056&r1=339055&r2=339056&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Mon Aug  6 14:16:16 2018
@@ -524,7 +524,7 @@ void InstrEmitter::EmitSubregNode(SDNode
       Reg = R->getReg();
       DefMI = nullptr;
     } else {
-      Reg = getVR(Node->getOperand(0), VRBaseMap);
+      Reg = R ? R->getReg() : getVR(Node->getOperand(0), VRBaseMap);
       DefMI = MRI->getVRegDef(Reg);
     }
 

Added: llvm/trunk/test/CodeGen/X86/large-pic-string.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/large-pic-string.ll?rev=339056&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/large-pic-string.ll (added)
+++ llvm/trunk/test/CodeGen/X86/large-pic-string.ll Mon Aug  6 14:16:16 2018
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+
+; RUN: llc < %s -code-model=large -relocation-model=pic -mtriple=x86_64--linux | FileCheck %s
+
+ at .str = private unnamed_addr constant [2 x i8] c"a\00", align 1
+
+define void @pr38385() {
+; CHECK-LABEL: pr38385:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:  .Ltmp0:
+; CHECK-NEXT:    leaq {{.*}}(%rip), %rax
+; CHECK-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp0, %rcx
+; CHECK-NEXT:    addq %rcx, %rax
+; CHECK-NEXT:    movabsq $.L.str at GOTOFF, %rcx
+; CHECK-NEXT:    addl %ecx, %eax
+; CHECK-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
+; CHECK-NEXT:    retq
+  %p = alloca i8, align 1
+  store i8 ptrtoint ([2 x i8]* @.str to i8), i8* %p, align 1
+  ret void
+}




More information about the llvm-commits mailing list