Real Madrid couldn't put Barcelona away when it had the chance and ended up being dealt a hard blow by its biggest rival.
In the first of two consecutive games between the Spanish powerhouses at Santiago Bernabeu Stadium, Barcelona weathered a dominant first half by Madrid and then scored three times after the break for a 3-0 win Wednesday and a spot in the Copa del Rey final for a sixth straight season.
"I have to admit that we didn't play very well in the first half," said Barcelona coach Ernesto Valverde after his 100th match in charge. "We scored three goals but didn't have that many chances. It happens sometimes."
Luis Suarez scored twice as Barcelona advanced 4-1 on aggregate after being held to a 1-1 draw in the first leg of the semifinals at Camp Nou three weeks ago. The Catalan club also benefited from an own goal by Madrid defender Raphael Varane.
"They were a lot more efficient than we were," Real Madrid coach Santiago Solari said. "We created many chances but couldn't score. They scored with their first shot on goal, and then with their second shot on goal. They hurt us when they had their chance."
Barcelona will be trying to win an unprecedented fifth straight Copa title in the May 25 final in Seville.
Madrid hasn't made it to the Copa final since it won its last title in 2014 against Barcelona. It hasn't defeated its rival in five matches in all competitions, since the Spanish Super Cup in 2017.
This year's other finalist will be decided on Thursday when Valencia hosts Real Betis after a 2-2 draw in the first leg in Seville.
It was the second of three matches between Real Madrid and Barcelona in less than a month. The rivals will also play each other on Saturday in the Spanish league, with Barcelona nine points in front of Madrid in the standings.
Another setback against Barcelona will practically end Madrid's title hopes in the league, leaving the Champions League as the only competition in which it can succeed in its first season without Cristiano Ronaldo in nearly a decade.
After conceding at home, Barcelona needed to score at the Bernabeu to have any chance of advancing, and it didn't look good for the Catalan club as it was outplayed by Madrid throughout the first half. The hosts created most of the scoring chances, including a couple of clear ones for young Brazilian forward Vinicius Junior. He failed to get a shot off in a one-on-one situation, then missed over the crossbar from close range.
"Vinicius will keep improving as he plays more of these types of games," Solari said.
Barcelona took advantage of Madrid's misses and quickly struck after halftime, with Suarez firing a low shot past goalkeeper Keylor Navas after a cross by Ousmane Dembele, who made a run behind the Madrid defenders following a through ball by Jordi Alba on the left flank.
The second goal came less than 10 minutes later when Varane tried to intercept Dembele's cross for Suarez and ended up finding his own net.
It didn't take long for Suarez to add another with a Panenka-style penalty in the 73rd after he was fouled by midfielder Casemiro inside the area.
Some Madrid fans began leaving the Bernabeu not long after Suarez's penalty hit the net, and a few chants protesting against club president Florentino Perez also followed.
Gareth Bale, who earlier Wednesday escaped punishment for a gesture toward fans after scoring in a league match against Atletico Madrid, came off the bench to replace Lucas Vazquez with Madrid down by a goal, but the Wales forward wasn't able to help much.