Exploiting Inherent Program Redundancy for Fault Tolerance