Add a transform pass to make the executable semantics of poison explicit in the IR
authorPhilip Reames <listmail@philipreames.com>
Tue, 9 Jul 2019 18:49:29 +0000 (18:49 +0000)
committerPhilip Reames <listmail@philipreames.com>
Tue, 9 Jul 2019 18:49:29 +0000 (18:49 +0000)
commitf47a313e717acb9c1b5bbdcf732cf08b042a8053
treed3bf2459062d5cdd7ab46a8c17ae970efb24cd53
parent210314ae8c59bc0a8801c2528eda892cd5960c31
Add a transform pass to make the executable semantics of poison explicit in the IR

Implements a transform pass which instruments IR such that poison semantics are made explicit. That is, it provides a (possibly partial) executable semantics for every instruction w.r.t. poison as specified in the LLVM LangRef. There are obvious parallels to the sanitizer tools, but this pass is focused purely on the semantics of LLVM IR, not any particular source language.

The target audience for this tool is developers working on or targetting LLVM from a frontend. The idea is to be able to take arbitrary IR (with the assumption of known inputs), and evaluate it concretely after having made poison semantics explicit to detect cases where either a) the original code executes UB, or b) a transform pass introduces UB which didn't exist in the original program.

At the moment, this is mostly the framework and still needs to be fleshed out. By reusing existing code we have decent coverage, but there's a lot of cases not yet handled. What's here is good enough to handle interesting cases though; for instance, one of the recent LFTR bugs involved UB being triggered by integer induction variables with nsw/nuw flags would be reported by the current code.

(See comment in PoisonChecking.cpp for full explanation and context)

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

llvm-svn: 365536
llvm/include/llvm/Transforms/Instrumentation/PoisonChecking.h [new file with mode: 0644]
llvm/lib/IR/Instruction.cpp
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassRegistry.def
llvm/lib/Transforms/Instrumentation/CMakeLists.txt
llvm/lib/Transforms/Instrumentation/PoisonChecking.cpp [new file with mode: 0644]
llvm/test/Instrumentation/PoisonChecking/basic-flag-validation.ll [new file with mode: 0644]
llvm/test/Instrumentation/PoisonChecking/ub-checks.ll [new file with mode: 0644]