[x86/SLH] Completely rework how we sink post-load hardening past data
commit54e7bf42bdfd162c0815463cdbb80e0dab29328b
authorChandler Carruth <chandlerc@gmail.com>
Mon, 16 Jul 2018 14:58:32 +0000 (16 14:58 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 16 Jul 2018 14:58:32 +0000 (16 14:58 +0000)
tree086dba1b903d47cb0f2efdad93c91163c68a8926
parent226a09e343305837230e748fdc6be439d41954ea
[x86/SLH] Completely rework how we sink post-load hardening past data
invariant instructions to be both more correct and much more powerful.

While testing, I continued to find issues with sinking post-load
hardening. Unfortunately, it was amazingly hard to create any useful
tests of this because we were mostly sinking across copies and other
loading instructions. The fact that we couldn't sink past normal
arithmetic was really a big oversight.

So first, I've ported roughly the same set of instructions from the data
invariant loads to also have their non-loading varieties understood to
be data invariant. I've also added a few instructions that came up so
often it again made testing complicated: inc, dec, and lea.

With this, I was able to shake out a few nasty bugs in the validity
checking. We need to restrict to hardening single-def instructions with
defined registers that match a particular form: GPRs that don't have
a NOREX constraint directly attached to their register class.

The (tiny!) test case included catches all of the issues I was seeing
(once we can sink the hardening at all) except for the NOREX issue. The
only test I have there is horrible. It is large, inexplicable, and
doesn't even produce an error unless you try to emit encodings. I can
keep looking for a way to test it, but I'm out of ideas really.

Thanks to Ben for giving me at least a sanity-check review. I'll follow
up with Craig to go over this more thoroughly post-commit, but without
it SLH crashes everywhere so landing it for now.

Differential Revision: https://reviews.llvm.org/D49378

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337177 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86SpeculativeLoadHardening.cpp
test/CodeGen/X86/speculative-load-hardening.ll