ir_constant: Don't assert on out-of-bounds array accesses

Several optimization paths, including constant folding, can lead to
accessing an ir_constant array with an out of bounds index.  The GLSL
spec lets us produce "undefined" results, but it does not let us
crash.

Fixes piglit test case glsl-array-bounds-01 and glsl-array-bounds-03.
This commit is contained in:
Ian Romanick 2010-08-17 12:57:28 -07:00
parent 1b708d8f4d
commit 664364052f

View file

@ -519,7 +519,21 @@ ir_constant *
ir_constant::get_array_element(unsigned i) const
{
assert(this->type->is_array());
assert(i < this->type->length);
/* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
*
* "Behavior is undefined if a shader subscripts an array with an index
* less than 0 or greater than or equal to the size the array was
* declared with."
*
* Most out-of-bounds accesses are removed before things could get this far.
* There are cases where non-constant array index values can get constant
* folded.
*/
if (int(i) < 0)
i = 0;
else if (i >= this->type->length)
i = this->type->length - 1;
return array_elements[i];
}