The Romanian top seed dropped her first set of the tournament as Ivanovic won five games in a row, but she responded with a crushing, 34-minute second set to level the match.
Two-time winner Ivanovic raced 3-0 ahead in the decider but Halep fought back again, winning 25 of the last 32 points against the second-seeded Serb.
"I played really well when she had break points to make it 4-1, and I'm really happy with the way I came back in the end," Halep said. "I'm a little bit injured in my leg but I'm very happy I was able to win today.
“Now I'm going to rest and recover and I hope to just come back and enjoy the final tomorrow."
She will face Sam Stosur after the Australian beat Anastasia Pavlyuchenkova 6-1 1-6 6-3 in a topsy-turvy semi.
"It was a tough match," Stosur said. "I got off to a good start, and she was missing a little bit in the first set, but then things totally changed around in the second set.
"The third set was the time where we both played our best. But I'm happy I was able to close it out in the end."
4-Samantha Stosur (Australia) beat 6-Anastasia Pavlyuchenkova (Russia) 6-1 1-6 6-3
1-Simona Halep (Romania) beat 2-Ana Ivanovic (Serbia) 2-6 6-1 6-3