AlignmentFill regions are placed in front of any item which has alignment > 1 bit, and this includes in front of anything with implicit alignment (unless the implicit alignment is 1 bit).
However, with some static analysis, one can determine that the item (sequence or element) already is aligned by necessity. I.e., the previous thing has left it on the right alignment boundary.
For example, if several adjacent elements are text in the same encoding, then we don't need alignmentFill regions before each one. There are many more cases that are also relatively easy to determine.
An attribute (i.e., LV) on each alignable thing (element, sequence, choice) should indicates what its statically-known alignment is. This is the basis for the optimization. Then the alignmentFill primitive can just optimize itself out (via guard) when the statically known alignment is sufficient.