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.
“To be able to end something like this, it’s incredible for me,” said world number two Alcaraz, 20, about halting Sinner’s streak.
“I stayed strong mentally – I think that’s a really important part in this game.
“This kind of match, a set down playing against someone that’s playing an unbelievable game – I’m really happy with the things I’ve done.
“I changed my style a little bit, I changed my game a little bit, and I think it worked very, very well,”
Sinner’s standards slipped in the third set, when he hit eight of his 15 unforced errors, while Alcaraz only made two unforced mistakes in the decider.
“It’s for sure not the ending that I wanted, but playing against him is always tough,” said world number three Sinner, 22.
“I tried to play good tennis, which I have done, especially in the first set.
“Then I made a couple of mistakes. The momentum changed. He raised his level.”
Alcaraz will be aiming to win his first title since Wimbledon last year when he takes on Medvedev.
“I know what happened last year so I’m going to try my best to try to turn this around, to play better, to play stronger, more on the lines, hit more aces, stuff like this,” said the 28-year-old Russian.
“Hopefully I will be able to do it.”