Carlos Alcaraz ended Jannik Sinner's 19-match unbeaten run to set up a final against Daniil Medvedev at Indian Wells.
Australian Open winner Sinner was 2-1 up in the first set when the match was interrupted by a three-hour rain delay.
The Italian won the opener when they resumed before Spaniard Alcaraz fought back to claim a 1-6 6-3 6-2 victory.
Russia's Medvedev also came back from a set down to win his semi-final 1-6 7-6 (7-3) 6-2 against American Tommy Paul.
The final will be a repeat of last year's which Alcaraz won comfortably.