[LLVMbugs] [Bug 9267] New: vector ZExt code generation bug

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat Feb 19 12:50:05 PST 2011


http://llvm.org/bugs/show_bug.cgi?id=9267

           Summary: vector ZExt code generation bug
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: nadav.rotem at intel.com
                CC: llvmbugs at cs.uiuc.edu


According to the LangRef, vector Zext are not supported by the spec. However,
we would like to enable them. Currently, most vector zext instructions would
crash the codegen in various places. For example:


llc: XXX/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:3914: llvm::SDValue
llvm::SelectionDAG::getLoad(llvm::ISD::MemIndexedMode, llvm::ISD::LoadExtType,
llvm::EVT, llvm::DebugLoc, llvm::SDValue, llvm::SDValue, llvm::SDValue,
llvm::EVT, llvm::MachineMemOperand*): Assertion `VT.isVector() ==
MemVT.isVector() && "Cannot use trunc store to convert to or from a vector!"'
failed.

vector zext is properly expanded to any_extend, except for cases where it is
combined with the load operation. The problem is with the DAGcombining pass. In
the first round, where it is okay to create illegal types and operations, it
creates a complex-zext load. The problem is that there is no legalizer to
legalize the newly load in the following stages. 


Here is a patch against 2.8. It works on a bunch of test cases that I
generated. 


Index: DAGCombiner.cpp
===================================================================
--- DAGCombiner.cpp    (revision XXX)
+++ DAGCombiner.cpp    (working copy)
@@ -3685,8 +3685,7 @@

   // fold (zext (load x)) -> (zext (truncate (zextload x)))
   if (ISD::isNON_EXTLoad(N0.getNode()) &&
-      ((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
-       TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()))) {
+      (TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()))) {
     bool DoXform = true;
     SmallVector<SDNode*, 4> SetCCs;
     if (!N0.hasOneUse())

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list