mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Support OpenCL 1.1 odd-length vector component accessors.
For hi/odd of an odd-length vector, the last component is undefined. Since we shuffle with an undef vector, no CodeGen needs to change to support this. llvm-svn: 91437
This commit is contained in:
@@ -639,8 +639,6 @@ def err_unsupported_vector_size : Error<
|
||||
"unsupported type %0 for vector_size attribute, please use on typedef">;
|
||||
def err_ext_vector_component_exceeds_length : Error<
|
||||
"vector component access exceeds type %0">;
|
||||
def err_ext_vector_component_requires_even : Error<
|
||||
"vector component access invalid for odd-sized type %0">;
|
||||
def err_ext_vector_component_name_illegal : Error<
|
||||
"illegal vector component name '%0'">;
|
||||
def err_attribute_address_space_not_int : Error<
|
||||
|
||||
@@ -2053,20 +2053,12 @@ CheckExtVectorComponent(QualType baseType, SourceLocation OpLoc,
|
||||
}
|
||||
}
|
||||
|
||||
// If this is a halving swizzle, verify that the base type has an even
|
||||
// number of elements.
|
||||
if (HalvingSwizzle && (vecType->getNumElements() & 1U)) {
|
||||
Diag(OpLoc, diag::err_ext_vector_component_requires_even)
|
||||
<< baseType << SourceRange(CompLoc);
|
||||
return QualType();
|
||||
}
|
||||
|
||||
// The component accessor looks fine - now we need to compute the actual type.
|
||||
// The vector type is implied by the component accessor. For example,
|
||||
// vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc.
|
||||
// vec4.s0 is a float, vec4.s23 is a vec3, etc.
|
||||
// vec4.hi, vec4.lo, vec4.e, and vec4.o all return vec2.
|
||||
unsigned CompSize = HalvingSwizzle ? vecType->getNumElements() / 2
|
||||
unsigned CompSize = HalvingSwizzle ? (vecType->getNumElements() + 1) / 2
|
||||
: CompName->getLength();
|
||||
if (HexSwizzle)
|
||||
CompSize--;
|
||||
|
||||
@@ -26,8 +26,6 @@ static void test() {
|
||||
f = vec2.x; // legal, shorten
|
||||
f = vec4.xy.x; // legal, shorten
|
||||
|
||||
vec2 = vec3.hi; // expected-error {{vector component access invalid for odd-sized type 'float3'}}
|
||||
|
||||
vec4_2.xyzx = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
|
||||
vec4_2.xyzz = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
|
||||
vec4_2.xyyw = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
|
||||
@@ -42,3 +40,8 @@ static void test() {
|
||||
|
||||
vec4p->yz = vec4p->xy;
|
||||
}
|
||||
|
||||
float2 lo(float3 x) { return x.lo; }
|
||||
float2 hi(float3 x) { return x.hi; }
|
||||
float2 ev(float3 x) { return x.even; }
|
||||
float2 od(float3 x) { return x.odd; }
|
||||
|
||||
Reference in New Issue
Block a user