[LLVMbugs] [Bug 8911] New: VMLA/VMLS codegen error

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Jan 5 06:00:28 PST 2011


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

           Summary: VMLA/VMLS codegen error
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Backend: ARM
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: rengolin at gmail.com
                CC: llvmbugs at cs.uiuc.edu


When faced with the following code:

#define __ARM_NEON__
#include <arm_neon.h>

float32x2_t f32d;

void vmul() {
  f32d = vmla_f32(f32d, f32d, f32d);
}

Clang produces the IR sequence:

  %tmp.i = load <2 x float>* %__a.addr.i, align 8
  %tmp1.i = load <2 x float>* %__b.addr.i, align 8
  %tmp2.i = load <2 x float>* %__c.addr.i, align 8
  %mul.i = fmul <2 x float> %tmp1.i, %tmp2.i
  %add.i = fadd <2 x float> %tmp.i, %mul.i

Which used to be translated into:

  vmla.f32  d0, d1, d2

A while ago, this was expanded wrongly to a pair of vmul+vadd but in the latest
trunk I'm getting the assert:

clang: /work/llvm/src/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:810:
llvm::SDValue<unnamed>::SelectionDAGLegalize::LegalizeOp(llvm::SDValue):
Assertion `(isTypeLegal(Node->getOperand(i).getValueType()) ||
Node->getOperand(i).getOpcode() == ISD::TargetConstant) && "Unexpected illegal
type!"' failed.

With Last error in the stack:

4.      Running pass 'ARM Instruction Selection' on function '@vmul'

I believe there are two bugs here, fixing the codegen assert will clear to
expose the real error, not matching mul+add to vmla.

-- 
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