Gareth Bale returned to the Madrid starting XI having scored from the bench against Celta and was on hand to set up Marcelo, himself involved from the start for the first time following a spell on the sidelines, for an early chance.
The Brazilian full-back could only guide Bale’s left-wing cross wide, and Dzeko should have punished that miss after 14 minutes, but failed to find the target from close range.
It was Zinedine Zidane’s men who controlled possession for much of the first half and Wojciech Szczesny had to be alert to get down and keep out Luka Modric’s low drive from 25 yards, which took a deflection on its way through.
Miralem Pjanic called for Roma to produce a “perfect” performance in the build-up to the fixture, but the Italians saw another glorious opportunity go begging as the match approached the half-hour mark – Salah finding the side-netting as goalkeeper Keylor Navas made himself big, although the whistle should arguably have been blown for an earlier foul on Danilo.
Ronaldo drifted in from the left to force another crucial save from Szczesny and the Pole ensured the scores remained level – on the night, at least – at half-time when he dived to his left to deny Casemiro.
A period of frantic activity in the Roma box led to an acrobatic effort from James that was well saved by Szczesny, before Salah left the visitors’ with the feeling that it was not going to be their day.
Having fired just wide from a promising position before the interval, the Egyptian’s second chance suffered the same fate after the ball fell into his path to leave him one on one with Navas.
Madrid continued to pull the trigger from all angles and Szczesny kept out efforts from Ronaldo and Marcelo, while Alessandro Florenzi tested Navas at the other end after knocking the ball beyond Sergio Ramos.
Ronaldo’s 64th-minute goal came after good work by Lucas Vazquez on the right – the substitute sending in a cross that the Portuguese lifted over the on-rushing Szczesny, who took a blow to the face as he came to meet the ball.
And it was game over four minutes later, when Ronaldo brought the ball forward before spreading wide for James to fire between Szczesny’s legs.
Ronaldo should have made it 3-0 moments later, but his uncharacteristic miss mattered little as Madrid sailed into the last eight.