  The direction of conditional branches is predicted correctly in modern
processors with great accuracy. We find several instructions in the dynamic
instruction stream that contribute only towards computing the condition of
these instructions. Hence, when the predicted direction of conditional branches
is indeed correct, these instructions become Ineffectual - the functional state
of the program would not be different had these instructions been dropped.
However, the execution of ineffectual instructions cannot be avoided altogether
because it is possible that the prediction of the branch direction is wrong. In
this work, we determine all sources of ineffectuality in an instruction stream
such as conditional branches, predicated instructions, indirect jumps and
dynamically dead instructions. Then, we propose a technique to steer the
ineffectual instructions away from the primary execution cluster so that
effectual instructions can execute uncontended. We find that such
ineffectuality-based clustering of instructions naturally simplifies the design
and avoids several caveats of a clustered architecture. Finally, we propose a
technique to detect instances when instructions were incorrectly marked as
ineffectual, say due to a branch misprediction, and recover the pipeline. The
empirical evaluation of the proposed changes on the SPEC CPU2017 and GAPBS
benchmarks show performance uplifts of up to 4.9% and 10.3% on average
respectively.
