@Override public void visitIfStmt(IfStmt ifStmt) { if (shouldRemove.test(ifStmt.getThenStmt())) { ifStmt.setThenStmt(getReplacementStmt(ifStmt.getThenStmt())); } if (ifStmt.hasElseStmt()) { if (shouldRemove.test(ifStmt.getElseStmt())) { ifStmt.setElseStmt(getReplacementStmt(ifStmt.getElseStmt())); } } super.visitIfStmt(ifStmt); }
@Override public void visitIfStmt(IfStmt ifStmt) { visitChildFromParent(ifStmt.getCondition(), ifStmt); visitChildFromParent(ifStmt.getThenStmt(), ifStmt); if (ifStmt.hasElseStmt()) { visitChildFromParent(ifStmt.getElseStmt(), ifStmt); } }
@Override public void replaceChild(IAstNode child, IAstNode newChild) { if (child == condition && newChild instanceof Expr) { setCondition((Expr) newChild); return; } if (child == thenStmt && newChild instanceof Stmt) { setThenStmt((Stmt) newChild); return; } if (child == elseStmt && newChild instanceof Stmt) { setElseStmt((Stmt) newChild); return; } throw new IllegalArgumentException(); }
@Override public void replaceNext(Stmt stmt) { if (chooseThen) { ifStmt.setThenStmt(stmt); } else { ifStmt.setElseStmt(stmt); } }
@Override public Stmt getNextStmt() { return chooseThen ? ifStmt.getThenStmt() : ifStmt.getElseStmt(); }
@Override public void visitIfStmt(IfStmt ifStmt) { if (!(ifStmt.getThenStmt() instanceof BlockStmt)) { maybeAddInjectionPoint(new IfInjectionPoint(ifStmt, true, currentFunction, inLoop(), currentScope)); } if (ifStmt.hasElseStmt()) { if (!(ifStmt.getElseStmt() instanceof BlockStmt)) { maybeAddInjectionPoint(new IfInjectionPoint(ifStmt, false, currentFunction, inLoop(), currentScope)); } } super.visitIfStmt(ifStmt); }
@Override public void visitIfStmt(IfStmt ifStmt) { super.visitIfStmt(ifStmt); if (MacroNames.isIfWrapperTrue(ifStmt.getCondition())) { addOpportunity(new UnwrapReductionOpportunity(ifStmt, ifStmt.getThenStmt(), parentMap, getVistitationDepth())); } else if (MacroNames.isIfWrapperFalse(ifStmt.getCondition())) { addOpportunity(new UnwrapReductionOpportunity(ifStmt, ifStmt.getElseStmt(), parentMap, getVistitationDepth())); } }
private Optional<Integer> indexOfRestorationFromBackup() { final Optional<Integer> maybeAssignmentIndex = indexOfAssignment(getOriginalVariableName(), backupName); if (maybeAssignmentIndex.isPresent()) { return maybeAssignmentIndex; } for (int i = 0; i < block.getNumStmts(); i++) { final Stmt stmt = block.getStmt(i); if (!(stmt instanceof IfStmt)) { continue; } final IfStmt ifStmt = (IfStmt) stmt; if (!MacroNames.isIfWrapperTrue(ifStmt.getCondition())) { continue; } if (isAssignment(ifStmt.getThenStmt(), getOriginalVariableName(), backupName)) { return Optional.of(i); } if (ifStmt.getThenStmt() instanceof BlockStmt && ((BlockStmt) ifStmt.getThenStmt()).getNumStmts() == 1 && isAssignment(((BlockStmt) ifStmt.getThenStmt()).getStmt(0), getOriginalVariableName(), backupName)) { return Optional.of(i); } } return Optional.empty(); }
private List<Stmt> regionStackToStmts(List<List<Stmt>> regionStack) { if (regionStack.size() == 1) { return regionStack.get(0); } final List<Stmt> result = new ArrayList<>(); result.addAll(regionStack.get(0)); // Check that the remainder actually contains some statements if (regionStack.subList(1, regionStack.size()).stream().anyMatch(item -> !item.isEmpty())) { result.add(new IfStmt( new UnaryExpr(makeHasReturned(), UnOp.LNOT), new BlockStmt(regionStackToStmts( regionStack.subList(1, regionStack.size())), true), null)); } return result; }
@Override public void visitIfStmt(IfStmt ifStmt) { super.visitIfStmt(ifStmt); if (MacroNames.isDeadByConstruction(ifStmt.getCondition()) || MacroNames.isIfWrapperFalse(ifStmt.getCondition()) || MacroNames.isIfWrapperTrue(ifStmt.getCondition())) { ifStmt.setCondition(ifStmt.getCondition().getChild(0)); } }
public static boolean isDeadCodeInjection(Stmt stmt) { return stmt instanceof IfStmt && MacroNames .isDeadByConstruction(((IfStmt) stmt).getCondition()); }
private static boolean suitableForSwitchInjection(IInjectionPoint injectionPoint) { if (!injectionPoint.hasNextStmt()) { return false; } final Stmt nextStmt = injectionPoint.getNextStmt(); // We are interested in blocks, and loops and conditionals with block bodies, // as long as there are no top-level breaks. if (isBlockWithoutTopLevelBreaks(nextStmt)) { return true; } if (nextStmt instanceof IfStmt) { final IfStmt nextIfStmt = (IfStmt) nextStmt; if (isBlockWithoutTopLevelBreaks(nextIfStmt.getThenStmt())) { return true; } if (nextIfStmt.hasElseStmt() && isBlockWithoutTopLevelBreaks(nextIfStmt.getElseStmt())) { return true; } } if (nextStmt instanceof LoopStmt && isBlockWithoutTopLevelBreaks(((LoopStmt) nextStmt).getBody())) { return true; } return false; }
private void handleRestrictedForLoop(ForStmt forStmt) { if (containsReturn(forStmt)) { forStmt.setBody(new BlockStmt( Arrays.asList( new IfStmt( makeHasReturned(), new BlockStmt(Arrays.asList(BreakStmt.INSTANCE), true), null), forStmt.getBody()), false)); } }
@Override public void visitIfStmt(IfStmt ifStmt) { super.visitIfStmt(ifStmt); if (!isBlock(ifStmt.getThenStmt())) { ifStmt.setThenStmt(makeBlock(ifStmt.getThenStmt())); } if (ifStmt.hasElseStmt() && !isBlock(ifStmt.getElseStmt())) { ifStmt.setElseStmt(makeBlock(ifStmt.getElseStmt())); } }
@Override public void visitIfStmt(IfStmt ifStmt) { super.visitIfStmt(ifStmt); if (MacroNames.isDeadByConstruction(ifStmt.getCondition())) { return; } addOpportunity(ifStmt, ifStmt.getThenStmt()); if (ifStmt.hasElseStmt()) { addOpportunity(ifStmt, ifStmt.getElseStmt()); } }
isBlockWithoutTopLevelBreaks(((IfStmt) stmt).getThenStmt()); boolean elseBranchCanBeTransformed = ((IfStmt) stmt).hasElseStmt() && isBlockWithoutTopLevelBreaks(((IfStmt) stmt).getElseStmt()); switchify(((IfStmt) stmt).getThenStmt(), injectionPoint, generator, shadingLanguageVersion, generationParams); return; switchify(((IfStmt) stmt).getElseStmt(), injectionPoint, generator, shadingLanguageVersion, generationParams); return; boolean transformedOne = false; if (generator.nextBoolean()) { switchify(((IfStmt) stmt).getThenStmt(), injectionPoint, generator, shadingLanguageVersion, generationParams); transformedOne = true; switchify(((IfStmt) stmt).getElseStmt(), injectionPoint, generator, shadingLanguageVersion, generationParams); transformedOne = true;
@Override public IfStmt clone() { return new IfStmt(condition.clone(), thenStmt.clone(), elseStmt == null ? null : elseStmt.clone()); }
@Override public void inject(Stmt stmt) { if (chooseThen) { assert !(ifStmt.getThenStmt() instanceof BlockStmt); List<Stmt> stmts = new ArrayList<>(); stmts.add(stmt); stmts.add(ifStmt.getThenStmt()); ifStmt.setThenStmt(new BlockStmt(stmts, false)); } else { assert ifStmt.hasElseStmt(); assert !(ifStmt.getElseStmt() instanceof BlockStmt); List<Stmt> stmts = new ArrayList<>(); stmts.add(stmt); stmts.add(ifStmt.getElseStmt()); ifStmt.setElseStmt(new BlockStmt(stmts, false)); } }
@Override public void visitIfStmt(IfStmt ifStmt) { out.append(indent() + "if("); visit(ifStmt.getCondition()); out.append(")" + newLine()); increaseIndent(); visit(ifStmt.getThenStmt()); decreaseIndent(); if (ifStmt.hasElseStmt()) { out.append(indent() + "else" + newLine()); increaseIndent(); visit(ifStmt.getElseStmt()); decreaseIndent(); } }
private IfStmt fuzzIfStmt() { final Expr condition = fuzzExpr(BasicType.BOOL, false, false, 0); final Stmt thenStmt = fuzzBlockStmt(true); Stmt elseStmt = null; if (generator.nextBoolean()) { elseStmt = fuzzBlockStmt(true); } return new IfStmt(condition, thenStmt, elseStmt); }