mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-25 18:55:48 +00:00
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! llvm-svn: 195367
This commit is contained in:
parent
dd3e75449f
commit
cf4143b55e
@ -1553,6 +1553,12 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
|
||||
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);
|
||||
|
17
clang/test/CodeGenOpenCL/vector_odd.cl
Normal file
17
clang/test/CodeGenOpenCL/vector_odd.cl
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user