The global ctor evaluator currently handles by checking whether the memset memory is already zero, and skips it in that case. However, it only actually check the first byte of the memory being set.
This patch extends the code to check all bytes being set. This is done byte-by-byte to avoid converting undef values to zeros in larger reads. However, the handling is still not completely correct, because there might still be padding bytes (though probably this doesn't matter much in practice, as I'd expect global variable padding to be zero-initialized in practice).
Mostly fixes https://github.com/llvm/llvm-project/issues/55859.
why is this necessary?