summaryrefslogtreecommitdiff
path: root/ir.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-04-21 11:54:02 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-04-28 18:22:54 -0700
commitae000fcb2e47a88d507a616709ae42d4aefae7a0 (patch)
treebb96a89220bc770f38bcca6e63893ff7702756ab /ir.cpp
parent73986a7a262807ab2cfd6d46ae17cfc7a30cdfec (diff)
Implement structures and arrays in ir_dereference::is_lvalue
Diffstat (limited to 'ir.cpp')
-rw-r--r--ir.cpp13
1 files changed, 6 insertions, 7 deletions
diff --git a/ir.cpp b/ir.cpp
index 7ada145d53..6778997ac8 100644
--- a/ir.cpp
+++ b/ir.cpp
@@ -260,22 +260,21 @@ ir_dereference::is_lvalue()
if (var == NULL)
return false;
+ ir_variable *const as_var = var->as_variable();
if (mode == ir_reference_variable) {
- ir_variable *const as_var = var->as_variable();
if (as_var == NULL)
return false;
if (as_var->type->is_array() && !as_var->array_lvalue)
return false;
+ }
+ if (as_var != NULL)
return !as_var->read_only;
- } else if (mode == ir_reference_array) {
- /* FINISHME: Walk up the dereference chain and figure out if
- * FINISHME: the variable is read-only.
- */
- }
- return true;
+ /* Walk up the dereference chain and figure out if the variable is read-only.
+ */
+ return this->var->as_rvalue()->is_lvalue();
}
ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,