To make room on the roster, the 49ers waived tight end Cole Wick.
Since the season-ending knee injury to Jimmy Garoppolo, the 49ers' starting quarterback has been C.J. Beathard. His backup is Nick Mullens.
Head coach Kyle Shanahan confirmed that Savage would be the team's No. 3 quarterback.
"Just looking at the guys out there, there's one thing I always liked about Savage, from coming out of college," Shanahan said during his Tuesday press conference. "He's got a strong arm. He's a very tough player. He hangs in that pocket and plays the position well.
"I was a fan of his coming out of college. He's gotten to play in a number of NFL games so he's been battle tested. He was in a tough situation in Houston that didn't work out for him, but I got to study him this preseason when he was in New Orleans and they have some similarities in their offense as ours. He had some high praises from [New Orleans Saints head coach] Sean Payton on him and I was excited that he was available."
NFLDraftScout.com projected Savage as a second-round prospect coming out of the University of Pittsburgh. However, the 6-foot-4, 230-pound Savage was drafted by the Houston Texans in the fourth round of the 2014 NFL Draft. In four seasons with Houston (2014-17), he appeared in 13 games, including nine starts, and completed 181-of-315 pass attempts for 2,000 yards, five touchdowns and six interceptions.
The Texans went 2-7 in his nine starts.
He signed with the New Orleans Saints on March 16, 2018, and was released by the team on Sept. 1, 2018.