-rw-r--r-- 1198 saferewrite-20210903/src/decode_761x1531/README
With clang -O1, avx and portable give warning-unrollmem because clang is
producing code that, via VEX and angr, turns into (e.g.)
v360 = constant(64,1)
...
v42558 = mem_7fffffffffefeda_136_16
...
v42578 = Extract(v42577,15,0)
v42579 = Concat(v42558,v42578)
v42580 = ZeroExt(v42579,32)
v42581 = __lshift__(v42580,v360)
v42582 = __add__(v42580,v42581)
v42583 = Extract(v42582,31,0)
v42584 = __add__(v42583,v364)
v42585 = Extract(v42584,15,0)
...
out_v_760 = v42585
with no other uses of v42558 and v42579 through v42585.
One can see this from the code snippet above that the output is actually
independent of mem_*: v42578 has 16 bits, so v42579 and v42580 are the
same as v42578 modulo 2^16, so v42581 is the same as 2*v42578 modulo
2^16, so v42582 and v42583 are the same as 3*v42578 modulo 2^16, so
v42584 and v42585 and out_v_760 are the same as 3*v42578+v364 modulo
2^16, independently of the mem_ value.
Perhaps warning-unrollmem should do extra tests to see whether there's a
real dependence on mem_*. But this is also implied by the fact that the
code passes an equals-... test against code with no warning-unrollmem,
such as ref with clang -O1.