private VariablesDeclaration fuzzGlobal() { // TODO: extend to allow generation of multiple globals per declaration group // TODO: extend to fuzz initializers and array globals return new VariablesDeclaration(fuzzType(), new VariableDeclInfo("g" + freshId(), null, null)); }
@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()); } } }
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()) ) ); } }
@Override public void visitVariableDeclInfo(VariableDeclInfo variableDeclInfo) { if (variableDeclInfo.hasArrayInfo()) { visitChildFromParent(this::visitArrayInfo, variableDeclInfo.getArrayInfo(), variableDeclInfo); } if (variableDeclInfo.hasInitializer()) { visitChildFromParent(variableDeclInfo.getInitializer(), variableDeclInfo); } }
private Optional<Integer> maybeGetArrayCount(VariableDeclInfo vdi) { if (vdi.hasArrayInfo()) { return Optional.of(vdi.getArrayInfo().getSize()); } return Optional.empty(); }
public String getVectorName() { return vectorVariableDeclInfo.getName(); }
for (int i = 0; i < variablesDeclaration.getNumDecls(); i++) { final VariableDeclInfo declInfo = variablesDeclaration.getDeclInfo(i); if (!declInfo.getName().equals(uniformName)) { continue; assert !declInfo.hasInitializer(); final BasicType withoutQualifiers = (BasicType) variablesDeclaration.getBaseType() .getWithoutQualifiers(); declInfo.setInitializer(makeInitializer( withoutQualifiers, declInfo.getArrayInfo(), uniformsInfo.getArgs(uniformName))); final VariablesDeclaration newVariablesDeclaration = new VariablesDeclaration( withoutQualifiers, declInfo);
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; }
final String typeName = basicType.toString(); for (VariableDeclInfo vdi : vd.getDeclInfos()) { if (containsKey(vdi.getName())) { continue; if (vdi.hasArrayInfo()) { arrayLength = vdi.getArrayInfo().getSize(); } else { arrayLength = 1; addUniform(vdi.getName(), basicType, maybeGetArrayCount(vdi), values);
if (declInfo.hasArrayInfo()) { return Optional.empty(); if (!declInfo.getName().equals(loopCounterName)) { return Optional.empty(); if (!(declInfo.getInitializer() instanceof ScalarInitializer)) { return Optional.empty(); .getInitializer()).getExpr()); if (!maybeStartValue.isPresent()) { return Optional.empty();
private void addGlobalInitializers(FunctionDefinition mainFunction) { assert mainFunction.getPrototype().getName().equals("main"); for (int i = globalsToBeReInitialized.size() - 1; i >= 0; i--) { for (int j = globalsToBeReInitialized.get(i).getNumDecls() - 1; j >= 0; j--) { final VariableDeclInfo vdi = globalsToBeReInitialized.get(i).getDeclInfo(j); if (!(vdi.getInitializer() instanceof ScalarInitializer)) { throw new RuntimeException("Only know how to deal with scalar initializers at present."); } mainFunction.getBody().insertStmt(0, new ExprStmt(new BinaryExpr(new VariableIdentifierExpr(vdi.getName()), ((ScalarInitializer) vdi.getInitializer()).getExpr(), BinOp.ASSIGN))); vdi.setInitializer(null); } } }
private boolean incompatibleComponentVariableIsDeclaredInBlock() { final BasicType expectedType = getComponentType(); for (VariablesDeclaration variablesDeclaration : block.getStmts() .stream() .filter(item -> item instanceof DeclarationStmt) .map(item -> (DeclarationStmt) item) .map(item -> item.getVariablesDeclaration()) .collect(Collectors.toList())) { final Type actualType = variablesDeclaration.getBaseType().getWithoutQualifiers(); for (VariableDeclInfo vdi : variablesDeclaration.getDeclInfos() .stream() .filter(item -> item.getName().equals(getComponentName())) .collect(Collectors.toList())) { if (actualType != expectedType || vdi.hasArrayInfo()) { return true; } } } return false; }
@Override public void visitVariablesDeclaration(VariablesDeclaration variablesDeclaration) { visit(variablesDeclaration.getBaseType()); List<VariableDeclInfo> children = new ArrayList<>(); children.addAll(variablesDeclaration.getDeclInfos()); for (VariableDeclInfo declInfo : children) { visitVariableDeclInfo(declInfo); currentScope.add(declInfo.getName(), declInfo.getArrayInfo() == null ? variablesDeclaration.getBaseType() : new ArrayType(variablesDeclaration.getBaseType(), declInfo.getArrayInfo()), Optional.empty(), declInfo, variablesDeclaration); visitVariableDeclInfoAfterAddedToScope(declInfo); } }
private void addComponentVariableIfNotPresent() { if (getAllVariableDeclInfosInBlock() .stream() .anyMatch(item -> item.getName().equals(getComponentName()))) { return; } block.insertStmt(0, new DeclarationStmt(new VariablesDeclaration( getComponentType(), new VariableDeclInfo(getComponentName(), null, null)))); }
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()); }
&& ((DeclarationStmt) init).getVariablesDeclaration().getNumDecls() == 1 && ((DeclarationStmt) init).getVariablesDeclaration().getDeclInfo(0) .getInitializer() instanceof ScalarInitializer) { name = ((DeclarationStmt) init).getVariablesDeclaration() .getDeclInfo(0).getName(); expr = ((ScalarInitializer)((DeclarationStmt) init) .getVariablesDeclaration().getDeclInfo(0) .getInitializer()).getExpr();
@Override public void applyReductionImpl() { if (originalNumVariables != declaration.getVariablesDeclaration().getNumDecls()) { // Something else changed how many declarations there are, so bail out. return; } final StructifiedVariableInfo originalVariableInfo = findOriginalVariableInfo(); // First, replace all occurrences in the translation unit deStructify(originalVariableInfo); // Now change the declaration declaration.getVariablesDeclaration().getDeclInfo(0).setName(originalVariableInfo.getName()); declaration.getVariablesDeclaration().setBaseType(originalVariableInfo.getType()); declaration.getVariablesDeclaration().getDeclInfo(0).setInitializer(originalVariableInfo .getInitializer().orElse(null)); }
public boolean hasInitializer() { return getInitializer() != null; }
public StructificationOpportunity(DeclarationStmt declToTransform, BlockStmt block, TranslationUnit tu, ShadingLanguageVersion shadingLanguageVersion) { assert declToTransform.getVariablesDeclaration().getNumDecls() == 1 : "Only solo declarations can be structified"; assert !declToTransform.getVariablesDeclaration().getDeclInfo(0).hasArrayInfo() : "Structification of arrays not supported"; this.declToTransform = declToTransform; this.block = block; this.tu = tu; this.shadingLanguageVersion = shadingLanguageVersion; }