Thanks everyone for the explanation. Can this be changed in tablegen itself or do targets rely on the current behavior?
A hacky check shows that X86 is the main offender, but Sparc and Hexagon also have possible errors related to this:
Target$ grep --include="*.td" -rHn "$" . | awk '/Predicates/,/\}/'| grep Requires |grep -v Additional
./Hexagon/HexagonInstrInfoV4.td:3110: Requires<[HasV4T]>;
./Hexagon/HexagonInstrInfoV4.td:3123: Requires<[HasV4T]>;
./Hexagon/HexagonInstrInfoV4.td:3135: Requires<[HasV4T]>;
./Sparc/SparcInstr64Bit.td:443: Requires<[HasHardQuad]>;
./Sparc/SparcInstr64Bit.td:457: Requires<[HasHardQuad]>;
./Sparc/SparcInstrInfo.td:1019: Requires<[HasHardQuad]>;
./Sparc/SparcInstrInfo.td:1028: Requires<[HasHardQuad]>;
./Sparc/SparcInstrInfo.td:1037: Requires<[HasHardQuad]>;
./Sparc/SparcInstrInfo.td:1088: Requires<[HasHardQuad]>;
./X86/X86InstrAVX512.td:4326: Requires<[OptForSize]>;
./X86/X86InstrAVX512.td:4331: Requires<[OptForSize]>;
./X86/X86InstrAVX512.td:4337: Requires<[OptForSize]>;
./X86/X86InstrAVX512.td:4343: Requires<[OptForSize]>;
./X86/X86InstrSSE.td:3629: (VSQRTSSr (f32 (IMPLICIT_DEF)), FR32:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:3632: Requires<[HasAVX, OptForSize]>;
./X86/X86InstrSSE.td:3634: (VSQRTSDr (f64 (IMPLICIT_DEF)), FR64:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:3637: Requires<[HasAVX, OptForSize]>;
./X86/X86InstrSSE.td:3640: (VRSQRTSSr (f32 (IMPLICIT_DEF)), FR32:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:3643: Requires<[HasAVX, OptForSize]>;
./X86/X86InstrSSE.td:3646: (VRCPSSr (f32 (IMPLICIT_DEF)), FR32:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:3649: Requires<[HasAVX, OptForSize]>;
./X86/X86InstrSSE.td:5273: (VMOVDDUPrm addr:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:5275: (VMOVDDUPrm addr:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:5277: (VMOVDDUPrm addr:$src)>, Requires<[HasAVX]>;
./X86/X86InstrSSE.td:5280: (VMOVDDUPrm addr:$src)>, Requires<[HasAVX]>;