Sounds like you're confusing the term dependency with the term hazard.
A true or flow dependency is condition where a value is assigned to a variable or storage earlier and that value is read/used/consumed from that same variable or storage later. This is a fundamental principle in programming, both in high level languages and assembly language/machine code — programmers rely on this, and frequently write dependencies.
When a variable is reassigned or register is repurposed (happens a lot in assembly) the old value is lost, and, the programmer's expectation (and architecture's promise) is that when later read, the new value is what is obtained.
Thus, since t1
is repurposed at I2 there can be no t1
dependency between I1 and I3.
Hazards, by contrast, are internal implementation concerns of pipelined and other advanced processors. A processor implementation must observe the architectural requirements of the instruction set it claims adherence to, regardless of internal implementation details, or else the claim is false, and software written for the instruction set won't work properly on the implementation.
Hazards often involve various kinds of dependencies. One very notable hazard, RAW (read after write), happens in pipelined processors when dependencies occur within small instruction distances (e.g. shorter than (a portion of) the pipeline).