| 138 | return false; |
| 139 | } |
| 140 | void propagateRead ( Expression * expr ) { |
| 141 | if ( expr->rtti_isVar() ) { |
| 142 | auto var = (ExprVar *) expr; |
| 143 | var->r2cr = true; |
| 144 | if ( var->variable->loop_source ) { |
| 145 | propagateRead(var->variable->loop_source); |
| 146 | } |
| 147 | } else if ( expr->rtti_isField() || expr->rtti_isSafeField() |
| 148 | || expr->rtti_isAsVariant() || expr->rtti_isIsVariant() |
| 149 | || expr->rtti_isSafeAsVariant() ) { |
| 150 | auto field = (ExprField *) expr; |
| 151 | field->r2cr = true; |
| 152 | propagateRead(field->value); |
| 153 | if ( func && field->value->type->isPointer() ) func->sideEffectFlags |= uint32_t(SideEffects::accessExternal); |
| 154 | } else if ( expr->rtti_isSwizzle() ) { |
| 155 | auto swiz = (ExprSwizzle *) expr; |
| 156 | swiz->r2cr = true; |
| 157 | propagateRead(swiz->value); |
| 158 | } else if ( expr->rtti_isAt() ) { |
| 159 | auto at = (ExprAt *) expr; |
| 160 | at->r2cr = true; |
| 161 | propagateAt(at); |
| 162 | } else if ( expr->rtti_isSafeAt() ) { |
| 163 | auto at = (ExprSafeAt *) expr; |
| 164 | at->r2cr = true; |
| 165 | propagateRead(at->subexpr); |
| 166 | propagateRead(at->index); |
| 167 | } else if ( expr->rtti_isOp3() ) { |
| 168 | auto op3 = (ExprOp3 *) expr; |
| 169 | propagateRead(op3->left); |
| 170 | propagateRead(op3->right); |
| 171 | } else if ( expr->rtti_isNullCoalescing() ) { |
| 172 | auto nc = (ExprNullCoalescing *) expr; |
| 173 | propagateRead(nc->subexpr); |
| 174 | propagateRead(nc->defaultValue); |
| 175 | } else if ( expr->rtti_isCast() ) { |
| 176 | auto ca = (ExprCast *) expr; |
| 177 | if ( isConstCast(ca->castType) ) { |
| 178 | propagateRead(ca->subexpr); |
| 179 | } else { |
| 180 | propagateWrite(ca->subexpr); |
| 181 | } |
| 182 | } else if ( expr->rtti_isRef2Ptr() ) { |
| 183 | auto rr = (ExprRef2Ptr *)expr; |
| 184 | propagateRead(rr->subexpr); |
| 185 | } else if ( expr->rtti_isPtr2Ref() ) { |
| 186 | auto rr = (ExprPtr2Ref *)expr; |
| 187 | propagateRead(rr->subexpr); |
| 188 | if ( func ) func->sideEffectFlags |= uint32_t(SideEffects::accessExternal); |
| 189 | } else if ( expr->rtti_isR2V() ) { |
| 190 | auto rr = (ExprRef2Value *)expr; |
| 191 | propagateRead(rr->subexpr); |
| 192 | } |
| 193 | } |
| 194 | void propagateWrite ( Expression * expr ) { |
| 195 | if ( expr->rtti_isVar() ) { |
| 196 | auto var = (ExprVar *) expr; |