docs: private IsNullValueFrame replaceValues(IsNullValueFrame origFrame, IsNullValueFrame frame, ValueNumber replaceMe,
              ValueNumberFrame prevVnaFrame, ValueNumberFrame targetVnaFrame, IsNullValue replacementValue) {
  
          if (!targetVnaFrame.isValid()) {
              throw new IllegalArgumentException("Invalid frame in " + methodGen.getClassName() + "." + methodGen.getName() + " : "
                      + methodGen.getSignature());
          }
          // If required, make a copy of the frame
          frame = modifyFrame(origFrame, frame);
  
          assert frame.getNumSlots() == targetVnaFrame.getNumSlots() : " frame has " + frame.getNumSlots() + ", target has "
                  + targetVnaFrame.getNumSlots() + " in  " + classAndMethod;
  
          // The VNA frame may have more slots than the IsNullValueFrame
          // if it was produced by an IF comparison (whose operand or operands
          // are subsequently popped off the stack).
  
          final int targetNumSlots = targetVnaFrame.getNumSlots();
          final int prefixNumSlots = Math.min(frame.getNumSlots(), prevVnaFrame.getNumSlots());
  
          if (trackValueNumbers) {
              AvailableLoad loadForV = prevVnaFrame.getLoad(replaceMe);
              if (DEBUG && loadForV != null) {
                  System.out.println("For " + replaceMe + " availableLoad is " + loadForV);
                  ValueNumber[] matchingValueNumbers = targetVnaFrame.getAvailableLoad(loadForV);
                  if (matchingValueNumbers != null) {
                      for (ValueNumber v2 : matchingValueNumbers) {
                          System.out.println("  matches " + v2);
                      }
                  }
              }
              if (loadForV != null) {
                  ValueNumber[] matchingValueNumbers = targetVnaFrame.getAvailableLoad(loadForV);
                  if (matchingValueNumbers != null) {
                      for (ValueNumber v2 : matchingValueNumbers) {
                          if (!replaceMe.equals(v2)) {
                              frame.setKnownValue(v2, replacementValue);
                              if (DEBUG) {
                                  System.out.println("For " + loadForV + " switch from " + replaceMe + " to " + v2);
                              }
                          }
                      }
                  }
              }
              frame.setKnownValue(replaceMe, replacementValue);
          }
          // Here's the deal:
          // - "replaceMe" is the value number from the previous frame (at the if
          // branch)
          // which indicates a value that we have updated is-null information
          // about
          // - in the target value number frame (at entry to the target block),
          // we find the value number in the stack slot corresponding to the
          // "replaceMe"
          // value; this is the "corresponding" value
          // - all instances of the "corresponding" value in the target frame have
          // their is-null information updated to "replacementValue"
          // This should thoroughly make use of the updated information.
  
          for (int i = 0; i < prefixNumSlots; ++i) {
              if (prevVnaFrame.getValue(i).equals(replaceMe)) {
                  ValueNumber corresponding = targetVnaFrame.getValue(i);
                  for (int j = 0; j < targetNumSlots; ++j) {
                      if (targetVnaFrame.getValue(j).equals(corresponding)) {
                          frame.setValue(j, replacementValue);
                      }
                  }
              }
          }
  
          return frame;
  
      }