[LLVMbugs] [Bug 13837] New: Creating vector from casted operations is not vectorized

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Sep 13 11:17:55 PDT 2012


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

             Bug #: 13837
           Summary: Creating vector from casted operations is not
                    vectorized
           Product: new-bugs
           Version: trunk
          Platform: PC
        OS/Version: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: weimingz at codeaurora.org
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


When a vector is created by casting each element from another vector, it fails
to generate vectorized cast. For example:

int4 conv4i(float4 in)
{
  int4 out={ (int)in.x, (int)in.y, (int)in.z, (int)in.w};
  return out;
}
where int4 and float4 are vector data type.

LLVM generates scalar casts. For example, on ARM, the code look like:
conv4i:
    vmov    d1, r2, r3
    vmov    d0, r0, r1
    vcvt.s32.f32    s7, s3
    vcvt.s32.f32    s6, s2
    vcvt.s32.f32    s5, s1
    vcvt.s32.f32    s4, s0
    vmov    r0, r1, d2
    vmov    r2, r3, d3
    bx    lr
instead of:
conv4i:
    vmov    d17, r2, r3
    vmov    d16, r0, r1
    vcvt.s32.f32    q8, q8
    vmov    r0, r1, d16
    vmov    r2, r3, d17
    bx    lr


The reason is that, in DAGCombine, when visit BUILD_VECTOR, it fails to check
if all its elements come from the same cast. If it is, then it should do
BUILD_VECOTR first, followed by casting.

Take the above C code for example:
before DAGCombine, the DAG look like
                    <float x 4>
      /             |        |          \
 extract_0    extract_1  extract_2  extract_3
     |              |        |          |
   fp2int          fp2int  fp2int      fp2int
     \              |        |          /
                 BUILD_VECTOR(int x 4)

It should be folded into:
                   <float x 4>
      /             |        |          \
 extract_0    extract_1  extract_2  extract_3
      \              |        |          /  
               BUILD_VECTOR(float x 4)
                       |
                     fp2int 

Later, the extraction and BUILD_VECTOR will be cancelled each other.

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