If the implementation contract that you are upgrading to is detected to be the identical to one that you previously deployed, it will use the existing implementation address. See Upgrade contract without changes to storage layout - #2 by ericglau
It will always run the upgrade when you call upgrades.upgradeProxy, because:
- The upgrade function on the contract is expected to emit an event, and
- You might want to call an arbitrary function on the contract when running it