World number one Novak Djokovic will meet number two Andy Murray in the Madrid Open final.
Djokovic beat Japan's Kei Nishikori in straight sets 6-3 7-6.
Defending champion Murray knocked out home favourite Rafael Nadal in the other semi-fina, repeating his victory over the Spaniard in last year's final and winning 7-5 6-4.
Djokovic looked on course for a comfortable win after breaking world number six Nishikori twice in the first set and earning three match points in the second when he was 5-4 up.
The Japanese fought back, however, saving the three match points and breaking the Serbian before forcing the tie break, where Djokovic prevailed 7-4.
Earlier, Murray broke Nadal in the Spaniard's second service game but lost his serve before breaking his opponent again to clinch the first set.
The Scot broke Nadal's third service game in the second and held his serve, taking advantage of a second match point after spurning the first.
"It's easy after winning a tight first set to drop your intensity or your level and I really tried to stay on top at the beginning of the second and that was important," Murray said.
"Rafa doesn't serve as hard as everyone else but he puts a lot of pressure on your return because if you don't hit a good one he dictates the point straight away with the forehand. I was able to get some quite good direction on the returns and I think that helped me a lot today."
Nadal admitted Murray had deserved to win but said the defeat, which prevents the Spaniard from collecting a third successive ATP title after winning the Monte Carlo Masters and the Barcelona Open, would not affect his mentality ahead of the French Open later this month.
"I played aggressively and to win but he served really well," said Nadal. "In general he was a little better than me and I congratulate him for the victory because he was more effective in the crucial points.
"I've had a good week, reaching another semi-final in the Masters and demonstrated a high level of consistency," he added.
"I think I was good on a mental level, fighting and looking for solutions but it wasn't enough."
Simona Halep won her first WTA title in more than a year as the Romanian beat Dominika Cibulkova 6-2 6-4 in the womens final to claim her 12th career trophy.
The victory in 80 minutes will send Halep, who last won an event at Indian Wells in March of last year, back to a ranking in the top five from her current place at seventh.