[LLVMdev] a packed constant cannot be referenced in the arithmetic instruction?

Chris Lattner sabre at nondot.org
Thu Apr 21 08:38:36 PDT 2005


On Thu, 21 Apr 2005, Tzu-Chien Chiu wrote:

> %foo1 = constant <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>;
> void %main() {
>    %x = mul <4 x float> %foo1, %foo1
>    ret void
> }
>
> llvm-as complained " Reference to an invalid definition: 'foo1' of
> type '<4 x float>' ".

That sort of constant is an LLVM global variable which is marked as 
constant.  To use this, you would use:

%foo1 = constant <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>;
void %main() {
    %foo1val = load <4 x float>* %foo1
    %x = mul <4 x float> %foo1val, %foo1val
    ret void
}

> I searched all test script in llvm/test, and I found the only way to
> use packed constant is:
>
> %foo1 = uninitialized global <4 x float>;
>
> void %main() {
>    store <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, <4
> x float>* %foo1
>    %l1 = load <4 x float>* %foo1
>    %x = mul <4 x float> %l1, %l1
>    ret void
> }
>
> (in "llvm/test/Feature/packed.ll")
>
> Why?

You should be able to do this as well (What I think you're trying to 
do with your original testcase):

void %main() {
    %x = mul <4 x float>  <float 1.0, float 2.0, float 3.0, float 4.0>,
                          <float 1.0, float 2.0, float 3.0, float 4.0>
    ret void
}

Note that support for packed types in not yet fully implemented.  In 
particular, the only way to codegen them currently is through the use of 
the -lower-packed pass, which converts them to scalar operations. 
Obviously we want to eventually codegen them to altivec, SSE, VIS, etc, 
but we don't currently have support for them.

-Chris

-- 
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/




More information about the llvm-dev mailing list