An operation is classified as redundant if either (a) it is unneeded thus simply omitting the execution of it will not change the output of the program; or (b) it is repeated, which means the result of this operation is the same as a former run.
The prevalent existence of these redundant operations is a main cause of performance bugs [1].
In this project, we intend to detect these bugs by 1) identifying the redundant operations on instruction granularity via dynamic slicing; and then 2) aggregating them into higher-level blocks that worth fixing.