Nineteen-year-old Bianca Andreescu will face Williams in the final of the Rogers Cup.
The unseeded home favourite beat American Sofia Kenin in two sets, 6-4 7-6.
She's spent much of the past year out with a shoulder injury but gained attention with her Indian Wells triumph in March.

Ruthless Man City thump Newcastle to reach League Cup final
Ethara named F1 promoter of the year
Alexandra Eala stages comeback to reach Mubadala quarter-finals
F1 legend Mika Häkkinen turns brand ambassador for Only Legends Drive UAE
Guardiola vows to speak up for victims of global conflicts
