r195367 - Fix a crash in EmitStoreThroughExtVectorComponentLValue for vectors of odd sizes.

Bill Wendling isanbard at gmail.com
Thu Nov 21 15:36:59 PST 2013


Done. Thanks!

-bw

On Nov 21, 2013, at 9:43 AM, Joey Gouly <joey.gouly at arm.com> wrote:

> Hi Bill,
> 
> Could you pull this into the 3.4 release?
> 
> Tom Stellard also wants it:
> http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131118/093809.h
> tml
> 
> Thanks,
> Joey
> 
> -----Original Message-----
> From: cfe-commits-bounces at cs.uiuc.edu
> [mailto:cfe-commits-bounces at cs.uiuc.edu] On Behalf Of Joey Gouly
> Sent: 21 November 2013 17:09
> To: cfe-commits at cs.uiuc.edu
> Subject: r195367 - Fix a crash in EmitStoreThroughExtVectorComponentLValue
> for vectors of odd sizes.
> 
> Author: joey
> Date: Thu Nov 21 11:09:05 2013
> New Revision: 195367
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=195367&view=rev
> Log:
> Fix a crash in EmitStoreThroughExtVectorComponentLValue for vectors of odd
> sizes.
> 
> In OpenCL a vector of 3 elements, acts like a vector of four elements.
> So for a vector of size 3 the '.hi' and '.odd' accessors, would access
> the elements {2, 3} and {1, 3} respectively.
> However, in EmitStoreThroughExtVectorComponentLValue we are still operating
> on
> a vector of size 3, so we should only access {2} and {1}. We do this by
> checking
> the last element to be accessed, and ignore it if it is out-of-bounds.
> 
> EmitLoadOfExtVectorElementLValue doesn't have a similar problem, because it
> does
> a direct shufflevector with undef, so an out-of-bounds access just gives an
> undef
> value.
> 
> Patch by Anastasia Stulova!
> 
> 
> 
> Added:
>    cfe/trunk/test/CodeGenOpenCL/vector_odd.cl
> Modified:
>    cfe/trunk/lib/CodeGen/CGExpr.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=195
> 367&r1=195366&r2=195367&view=diff
> ============================================================================
> ==
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Nov 21 11:09:05 2013
> @@ -1553,6 +1553,12 @@ void CodeGenFunction::EmitStoreThroughEx
>       for (unsigned i = 0; i != NumDstElts; ++i)
>         Mask.push_back(Builder.getInt32(i));
> 
> +      // When the vector size is odd and .odd or .hi is used, the last
> element
> +      // of the Elts constant array will be one past the size of the
> vector.
> +      // Ignore the last element here, if it is greater than the mask size.
> +      if (getAccessedFieldNo(NumSrcElts - 1, Elts) == Mask.size())
> +        NumSrcElts--;
> +
>       // modify when what gets shuffled in
>       for (unsigned i = 0; i != NumSrcElts; ++i)
>         Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i+NumDstElts);
> 
> Added: cfe/trunk/test/CodeGenOpenCL/vector_odd.cl
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/vector_odd.
> cl?rev=195367&view=auto
> ============================================================================
> ==
> --- cfe/trunk/test/CodeGenOpenCL/vector_odd.cl (added)
> +++ cfe/trunk/test/CodeGenOpenCL/vector_odd.cl Thu Nov 21 11:09:05 2013
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 %s -O0 -emit-llvm -o - | FileCheck %s
> +
> +typedef unsigned char __attribute__((ext_vector_type(3))) uchar3;
> +
> +//CHECK: {{%.*}} = shufflevector <3 x i8> {{%.*}}, <3 x i8> <i8 1, i8 1, i8
> undef>, <3 x i32> <i32 0, i32 3, i32 2>
> +
> +kernel void test_odd_vector1 (uchar3 lhs)
> +{
> +  lhs.odd = 1;
> +}
> +
> +//CHECK: {{%.*}} = shufflevector <3 x i8> {{%.*}}, <3 x i8> <i8 2, i8 2, i8
> undef>, <3 x i32> <i32 0, i32 1, i32 3>
> +
> +kernel void test_odd_vector2 (uchar3 lhs)
> +{
> +  lhs.hi = 2;
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 
> 
> 
> 





More information about the cfe-commits mailing list