Summary: Instead of relying on Exp.nondet to encode the semantics of LLVM's undef, translate each to a per-function unique register, with a nondet assignment to it prior to each use. This avoids the need for Exp.nondet, which is ill-formed in the sense that expressions denote values, not sets of values (with particular constraints on what ways in which the choice must be angelic vs demonic). This change essentially allows the backend to be sane, and makes it the frontend's problem to deal with LLVM's undef. This treatment, like the treatment based on Exp.nondet, is expected to result in LLAIR code with different semantics of undef compared to the semantics of LLVM described in the [LangRef](https://llvm.org/docs/LangRef.html#undefined-values). In particular, the LLVM LangRef states > An ‘undef’ “variable” can arbitrarily change its value over its > “live range”. This is true because the variable doesn’t actually > have a live range. Instead, the value is logically read from > arbitrary registers that happen to be around when needed, so the > value is not necessarily consistent over time. To model this ability of undef to arbitrarily change its value over its live range, it is likely that additional nondet assignments would need to be added. Exactly where it not currently known. Reviewed By: jvillard Differential Revision: D21720976 fbshipit-source-id: 90c2a0d26master
parent
e17f8adfe9
commit
dde116b040
Loading…
Reference in new issue