The stage, which finished in the Autodromo Enzo e Dino Ferrari after 214km, was certainly one for the sprinters.
Lotto-Soudal’s Tim Wellens executed the first attack with 20km to go, giving him a lead of about 10 seconds.
The gap had increased to 23 seconds with 12km remaining.
As the riders started their climb up Tre Monti, the Belgian was caught by the peloton with Katusha-Alpecin’s Alex Dowsett and Team Sky’s Sergio Henao attacking. The latter went off the front but was soon caught.
A string of attacks followed from BMC Racing Team’s Rohan Dennis, Bennett and UAE Team Emirates’ Diego Ulissi.
Ulissi established a small gap over the peloton and soon had Movistar Team’s Carlos Betancur up with him. Betancur and Bahrain-Merida’s Matej Mohoric then created a four-second gap to the peloton.
However, Bennett robustly sprinted past them to take the win, becoming the first Irish rider to win two Giro d’Italia stages.
He was followed home in quick succession by LottoNL-Jumbo’s Danny van Poppel and Bahrain-Merida’s Niccolo Bonifazio.
“I think it was a bunch sprint but it was a tough final. We still had two guys in front – I didn’t know how much energy they had left but I didn’t want another stage getting away from me,” said Bennett.
“So I decided to go early, I didn’t know if I could hold it or not. I think I caught some guys by surprise, so it worked to my advantage.”
Mitchelton-Scott’s Simon Yates extended his overall lead. While not finishing on the podium, the British cyclist had another good day yesterday.
Team Sky’s Chris Froome, however, has still not turned his fortunes around. Yesterday he lost 40 seconds and dropped out of the top 10. He finished 37th on today’s stage and placed 12th overall.
Tomorrow’s stage will start in Ferrara and finish 180km later in Nervesa della Battaglia.