private void addArrayMatchEdges(LocalPointerKey pk) {
   Collection<MemoryAccess> arrayWrites = fam.getArrayWrites(null);
   for (MemoryAccess a : arrayWrites) {
     addSubgraphForNode(a.getNode());
   }
   for (MemoryAccess a : arrayWrites) {
     IR ir = a.getNode().getIR();
     SSAArrayStoreInstruction s =
         (SSAArrayStoreInstruction) ir.getInstructions()[a.getInstructionIndex()];
     PointerKey r = heapModel.getPointerKeyForLocal(a.getNode(), s.getValue());
     assert containsNode(r);
     assert containsNode(pk);
     addMatchEdge(pk, r);
   }
 }
 /*
  * (non-Javadoc)
  *
  * @see com.ibm.domo.ssa.SSAInstruction.Visitor#visitArrayStore(com.ibm.domo.ssa.SSAArrayStoreInstruction)
  */
 @Override
 public void visitArrayStore(SSAArrayStoreInstruction instruction) {
   // Assertions.UNREACHABLE();
   // skip arrays of primitive type
   if (instruction.typeIsPrimitive()) {
     return;
   }
   // make node for used value
   PointerKey value = heapModel.getPointerKeyForLocal(node, instruction.getValue());
   addNode(value);
   //
   // // (requires the creation of assign constraints as
   // // the set points-to(a[]) grows.)
   // PointerKey arrayRef = getPointerKeyForLocal(node,
   // instruction.getArrayRef());
   // // if (!supportFullPointerFlowGraph &&
   // // contentsAreInvariant(instruction.getArrayRef())) {
   // if (contentsAreInvariant(symbolTable, du, instruction.getArrayRef())) {
   // system.recordImplicitPointsToSet(arrayRef);
   // InstanceKey[] ik = getInvariantContents(symbolTable, du, node,
   // instruction.getArrayRef(),
   // SSAPropagationCallGraphBuilder.this);
   //
   // for (int i = 0; i < ik.length; i++) {
   // system.findOrCreateIndexForInstanceKey(ik[i]);
   // PointerKey p = getPointerKeyForArrayContents(ik[i]);
   // IClass contents = ((ArrayClass)
   // ik[i].getConcreteType()).getElementClass();
   // if (p == null) {
   // getWarnings().add(ResolutionFailure.create(node,
   // ik[i].getConcreteType()));
   // } else {
   // if (DEBUG_TRACK_INSTANCE) {
   // if (system.findOrCreateIndexForInstanceKey(ik[i]) ==
   // DEBUG_INSTANCE_KEY) {
   // Assertions.UNREACHABLE();
   // }
   // }
   // if (contentsAreInvariant(symbolTable, du, instruction.getValue())) {
   // system.recordImplicitPointsToSet(value);
   // InstanceKey[] vk = getInvariantContents(symbolTable, du, node,
   // instruction.getValue(),
   // SSAPropagationCallGraphBuilder.this);
   // for (int j = 0; j < vk.length; j++) {
   // system.findOrCreateIndexForInstanceKey(vk[j]);
   // if (vk[j].getConcreteType() != null) {
   // if (contents.isInterface()) {
   // if (getClassHierarchy().implementsInterface(vk[j].getConcreteType(),
   // contents.getReference())) {
   // system.newConstraint(p, vk[j]);
   // }
   // } else {
   // if (getClassHierarchy().isSubclassOf(vk[j].getConcreteType(),
   // contents)) {
   // system.newConstraint(p, vk[j]);
   // }
   // }
   // }
   // }
   // } else {
   // if (isRootType(contents)) {
   // system.newConstraint(p, assignOperator, value);
   // } else {
   // system.newConstraint(p, filterOperator, value);
   // }
   // }
   // }
   // }
   // } else {
   // if (contentsAreInvariant(symbolTable, du, instruction.getValue())) {
   // system.recordImplicitPointsToSet(value);
   // InstanceKey[] ik = getInvariantContents(symbolTable, du, node,
   // instruction.getValue(),
   // SSAPropagationCallGraphBuilder.this);
   // for (int i = 0; i < ik.length; i++) {
   // system.findOrCreateIndexForInstanceKey(ik[i]);
   // if (Assertions.verifyAssertions) {
   // Assertions._assert(!system.isUnified(arrayRef));
   // }
   // system.newSideEffect(new InstanceArrayStoreOperator(ik[i]), arrayRef);
   // }
   // } else {
   // system.newSideEffect(new
   // ArrayStoreOperator(system.findOrCreatePointsToSet(value)), arrayRef);
   // }
   // }
 }