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: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to