boolean initializerIsScalarAndSideEffectFree(VariableDeclInfo variableDeclInfo) { if (!variableDeclInfo.hasInitializer()) { return false; } if (!(variableDeclInfo.getInitializer() instanceof ScalarInitializer)) { return false; } return SideEffectChecker.isSideEffectFree( ((ScalarInitializer) variableDeclInfo.getInitializer()).getExpr(), context.getShadingLanguageVersion()); }
@Override public void visitVariablesDeclaration(VariablesDeclaration variablesDeclaration) { final Type baseType = variablesDeclaration.getBaseType(); visit(baseType); out.append(" "); boolean first = true; for (VariableDeclInfo vdi : variablesDeclaration.getDeclInfos()) { if (!first) { out.append(", "); } first = false; out.append(vdi.getName()); if (vdi.hasArrayInfo()) { out.append("[" + vdi.getArrayInfo().getSize() + "]"); assert !(baseType instanceof ArrayType); } else if (baseType instanceof ArrayType) { out.append("[" + ((ArrayType) baseType).getArrayInfo().getSize() + "]"); } if (vdi.hasInitializer()) { out.append(" = "); visit(vdi.getInitializer()); } } }
@Override public void visitVariableDeclInfo(VariableDeclInfo variableDeclInfo) { if (variableDeclInfo.hasArrayInfo()) { visitChildFromParent(this::visitArrayInfo, variableDeclInfo.getArrayInfo(), variableDeclInfo); } if (variableDeclInfo.hasInitializer()) { visitChildFromParent(variableDeclInfo.getInitializer(), variableDeclInfo); } }
assert !declInfo.hasInitializer(); final BasicType withoutQualifiers = (BasicType) variablesDeclaration.getBaseType() .getWithoutQualifiers();
private boolean allowedToReduceLocalDecl(VariableDeclInfo variableDeclInfo) { // Check that the variable declaration is part of a declaration statement // inside a block VariablesDeclaration vd = (VariablesDeclaration) parentMap.getParent(variableDeclInfo); if (!(parentMap.getParent(vd) instanceof DeclarationStmt)) { return false; } if (!(parentMap.getParent(parentMap.getParent(vd)) instanceof BlockStmt)) { return false; } // Fine to remove if in a dead context, a live context, if no initializer, or if // initializer does not have side effects. return context.reduceEverywhere() || enclosingFunctionIsDead() || injectionTracker.enclosedByDeadCodeInjection() || isLiveInjection(variableDeclInfo) || !variableDeclInfo.hasInitializer() || initializerIsScalarAndSideEffectFree(variableDeclInfo); }
private boolean allowedToReduce(VariableDeclInfo variableDeclInfo) { if (!variableDeclInfo.hasInitializer()) { return false; } if (initializerIsTooBig(variableDeclInfo.getInitializer())) { return false; } if (context.reduceEverywhere()) { return true; } if (currentProgramPointHasNoEffect()) { return true; } if (StmtReductionOpportunities.isLooplimiter(variableDeclInfo.getName())) { // Do not mess with loop limiters. return false; } if (initializerIsScalarAndSideEffectFree(variableDeclInfo) && !referencesVariableIdentifier(variableDeclInfo.getInitializer())) { // We need to be careful about inlining e.g.: "int x = y;", because if y is then modified, // inlined uses of x would get the new value of y. return true; } return false; }
private void structifyDeclaration(String enclosingStructVariableName, StructDefinitionType enclosingStructType) { declToTransform.getVariablesDeclaration() .setBaseType(enclosingStructType.getStructNameType()); final VariableDeclInfo declInfo = declToTransform.getVariablesDeclaration().getDeclInfo(0); declInfo.setName(enclosingStructVariableName); if (declInfo.hasInitializer()) { declInfo.setInitializer( new ScalarInitializer( makeInitializationExpr(enclosingStructType, ((ScalarInitializer) declInfo.getInitializer()).getExpr()) ) ); } }