Serena Williams beat qualifier Marie Bouzkova to set up a Rogers Cup final in Toronto against Canadian teenager Bianca Andreescu.
Bouzkova started strongly before being overpowered 1-6 6-3 6-3 by 23-time Grand Slam champion Williams.
Andreescu beat American Sofia Kenin 6-4 7-6 (7-5) in the other semi-final and is the first Canadian woman to reach the final of the tournament since 1969.
“I just felt like crying after because I’m just so happy,” she said.
Czech Bouzkova, 21, had said before the match she would be playing her idol but she showed no signs of being intimidated, in what was her first WTA semi-final appearance, and took the first set 6-1.
Williams admitted she had to “make some adjustments, mostly mentally,” after that first set.
She will now be seeking to win her first title since returning to competition in 2018 after the birth of her daughter when she faces Andreescu on Sunday.
The 19-year-old, competing for the first time since withdrawing from the French Open with a shoulder injury, won her maiden WTA title at Indian Wells in March.
- Live scores, schedule and results
- Alerts: Get tennis news sent to your phone