Weaving Atomicity Through Dynamic Dependence Tracking