Don't fold
(zext (and (load x), cst)) -> (and (zextload x), (zext cst))
if
(and (load x) cst)
will match as a zextload already and has additional users.
For example, the following IR:
%load = load i32, i32* %ptr, align 8 %load16 = and i32 %load, 65535 %load64 = zext i32 %load16 to i64 store i32 %load16, i32* %dst1, align 4 store i64 %load64, i64* %dst2, align 8
used to produce the following aarch64 code:
ldr w8, [x0] and w9, w8, #0xffff and x8, x8, #0xffff str w9, [x1] str x8, [x2]
but with this change produces the following aarch64 code:
ldrh w8, [x0] str w8, [x1] str x8, [x2]
Perhaps, "(and (load x) cst)" to be consistent with documentation elsewhere?