public FastSparseSet<E> getCopy() { int arrlength = data.length; int[] cpdata = new int[arrlength]; int[] cpnext = new int[arrlength]; System.arraycopy(data, 0, cpdata, 0, arrlength); System.arraycopy(next, 0, cpnext, 0, arrlength); return new FastSparseSet<>(factory, cpdata, cpnext); }
vers.add(vernode.preds.iterator().next().source.version); vers.add(edge.source.preds.iterator().next().source.version); vers.add(nextver); createOrUpdatePhiNode(varpaar, vers, stat); phantomppnodes.put(varpaar, phantomver); int cardinality = vers.getCardinality(); if (cardinality == 1) { // size == 1 if (current_vers != 0) { Integer lastver = vers.iterator().next(); VarVersionNode prenode = ssuversions.nodes.getWithKey(new VarVersionPair(varindex, lastver)); VarVersionNode usenode = ssuversions.createNode(new VarVersionPair(varindex, usever));
private static void replaceSingleVar(Exprent parent, VarExprent var, Exprent dest, SSAUConstructorSparseEx ssau) { parent.replaceExprent(var, dest); // live sets SFormsFastMapDirect livemap = ssau.getLiveVarVersionsMap(new VarVersionPair(var)); Set<VarVersionPair> setVars = getAllVersions(dest); for (VarVersionPair varpaar : setVars) { VarVersionNode node = ssau.getSsuversions().nodes.getWithKey(varpaar); for (Iterator<Entry<Integer, FastSparseSet<Integer>>> itent = node.live.entryList().iterator(); itent.hasNext(); ) { Entry<Integer, FastSparseSet<Integer>> ent = itent.next(); Integer key = ent.getKey(); if (!livemap.containsKey(key)) { itent.remove(); } else { FastSparseSet<Integer> set = ent.getValue(); set.complement(livemap.get(key)); if (set.isEmpty()) { itent.remove(); } } } } }
vers.add(vernode.preds.iterator().next().source.version); vers.add(edge.source.preds.iterator().next().source.version); vers.add(nextver); createOrUpdatePhiNode(varpaar, vers, stat); phantomppnodes.put(varpaar, phantomver); int cardinality = vers.getCardinality(); if (cardinality == 1) { // size == 1 if (current_vers.intValue() != 0) { Integer lastver = vers.iterator().next(); VarVersionNode prenode = ssuversions.nodes.getWithKey(new VarVersionPair(varindex, lastver)); VarVersionNode usenode = ssuversions.createNode(new VarVersionPair(varindex, usever));
FastSparseSet<Integer> vers = varmap.get(varindex); int cardinality = vers.getCardinality(); if (cardinality == 1) { // == 1 Integer it = vers.iterator().next(); vardest.setVersion(it.intValue()); setCurrentVar(varmap, varindex, current_vers); phi.get(currpaar).union(vers);
private void createOrUpdatePhiNode(VarVersionPair phivar, FastSparseSet<Integer> vers, Statement stat) { FastSparseSet<Integer> versCopy = vers.getCopy(); HashSet<Integer> phiVers = new HashSet<>(); for (VarVersionEdge edge : lstPreds) { int verssrc = edge.source.preds.iterator().next().source.version; if (!vers.contains(verssrc) && verssrc != ppvers) { edge.source.removeSuccessor(edge); phinode.removePredecessor(edge); versCopy.remove(verssrc); phiVers.add(verssrc);
FastSparseSet<Integer> set = arr[pointer]; if (set != null) { arrnew[pointer] = set.getCopy();
public void complement(SFormsFastMapDirect map) { for (int i = 2; i >= 0; i--) { FastSparseSet<Integer>[] lstOwn = elements[i]; if (lstOwn.length == 0) { continue; } FastSparseSet<Integer>[] lstExtern = map.elements[i]; int[] arrnext = next[i]; int pointer = 0; do { FastSparseSet<Integer> first = lstOwn[pointer]; if (first != null) { if (pointer >= lstExtern.length) { break; } FastSparseSet<Integer> second = lstExtern[pointer]; if (second != null) { first.complement(second); if (first.isEmpty()) { lstOwn[pointer] = null; size--; changeNext(arrnext, pointer, pointer, arrnext[pointer]); } } } pointer = arrnext[pointer]; } while (pointer != 0); } }
private SFormsFastMapDirect createFirstMap(StructMethod mt) { boolean thisvar = !mt.hasModifier(CodeConstants.ACC_STATIC); MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor()); int paramcount = md.params.length + (thisvar ? 1 : 0); int varindex = 0; SFormsFastMapDirect map = new SFormsFastMapDirect(); for (int i = 0; i < paramcount; i++) { int version = getNextFreeVersion(varindex); // == 1 FastSparseSet<Integer> set = factory.spawnEmptySet(); set.add(version); map.put(varindex, set); startVars.add(new VarVersionPair(varindex, version)); if (thisvar) { if (i == 0) { varindex++; } else { varindex += md.params[i - 1].stackSize; } } else { varindex += md.params[i].stackSize; } } return map; }
private SFormsFastMapDirect createFirstMap(StructMethod mt, RootStatement root) { boolean thisvar = !mt.hasModifier(CodeConstants.ACC_STATIC); MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor()); int paramcount = md.params.length + (thisvar ? 1 : 0); int varindex = 0; SFormsFastMapDirect map = new SFormsFastMapDirect(); for (int i = 0; i < paramcount; i++) { int version = getNextFreeVersion(varindex, root); // == 1 FastSparseSet<Integer> set = factory.spawnEmptySet(); set.add(version); map.put(varindex, set); ssuversions.createNode(new VarVersionPair(varindex, version)); if (thisvar) { if (i == 0) { varindex++; } else { varindex += md.params[i - 1].stackSize; } } else { varindex += md.params[i].stackSize; } } return map; }
private static void replaceSingleVar(Exprent parent, VarExprent var, Exprent dest, SSAUConstructorSparseEx ssau) { parent.replaceExprent(var, dest); // live sets SFormsFastMapDirect livemap = ssau.getLiveVarVersionsMap(new VarVersionPair(var)); HashSet<VarVersionPair> setVars = getAllVersions(dest); for (VarVersionPair varpaar : setVars) { VarVersionNode node = ssau.getSsuversions().nodes.getWithKey(varpaar); for (Iterator<Entry<Integer, FastSparseSet<Integer>>> itent = node.live.entryList().iterator(); itent.hasNext(); ) { Entry<Integer, FastSparseSet<Integer>> ent = itent.next(); Integer key = ent.getKey(); if (!livemap.containsKey(key)) { itent.remove(); } else { FastSparseSet<Integer> set = ent.getValue(); set.complement(livemap.get(key)); if (set.isEmpty()) { itent.remove(); } } } } }
public boolean equals(Object o) { if (o == this) return true; if (o == null || !(o instanceof FastSparseSet)) return false; int[] longdata = ((FastSparseSet)o).getData(); int[] shortdata = data; if (data.length > longdata.length) { shortdata = longdata; longdata = data; } for (int i = shortdata.length - 1; i >= 0; i--) { if (shortdata[i] != longdata[i]) { return false; } } for (int i = longdata.length - 1; i >= shortdata.length; i--) { if (longdata[i] != 0) { return false; } } return true; }
public void union(FastSparseSet<E> set) { int[] extdata = set.getData(); int[] extnext = set.getNext(); int[] intdata = data; int intlength = intdata.length; int pointer = 0; do { if (pointer >= intlength) { intdata = ensureCapacity(extdata.length - 1); } boolean nextrec = (intdata[pointer] == 0); intdata[pointer] |= extdata[pointer]; if (nextrec) { changeNext(next, pointer, next[pointer], pointer); } pointer = extnext[pointer]; } while (pointer != 0); }
public void symdiff(FastSparseSet<E> set) { int[] extdata = set.getData(); int[] intdata = data; int minlength = Math.min(extdata.length, intdata.length); for (int i = minlength - 1; i >= 0; i--) { intdata[i] ^= extdata[i]; } boolean expanded = false; for (int i = extdata.length - 1; i >= minlength; i--) { if (extdata[i] != 0) { if (!expanded) { intdata = ensureCapacity(extdata.length - 1); } intdata[i] = extdata[i]; } } setNext(); }
public boolean contains(FastSparseSet<E> set) { int[] extdata = set.getData(); int[] intdata = data; int minlength = Math.min(extdata.length, intdata.length); for (int i = minlength - 1; i >= 0; i--) { if ((extdata[i] & ~intdata[i]) != 0) { return false; } } for (int i = extdata.length - 1; i >= minlength; i--) { if (extdata[i] != 0) { return false; } } return true; }
public void complement(FastSparseSet<E> set) { int[] extdata = set.getData(); int[] intdata = data; int extlength = extdata.length; int pointer = 0; do { if (pointer >= extlength) { break; } intdata[pointer] &= ~extdata[pointer]; if (intdata[pointer] == 0) { changeNext(next, pointer, pointer, next[pointer]); } pointer = next[pointer]; } while (pointer != 0); }
public FastSparseSet<E> spawnEmptySet() { return new FastSparseSet<>(this); }