-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.