mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
[msan] Fix getOriginForNaryOp.
The old version failed on a 3-arg instruction with (-1, 0, 0) shadows (it would pick the 3rd operand origin irrespective of its shadow). The new version always picks the origin of the rightmost poisoned operand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
35b3df6e31
commit
b096a9d02f
@ -842,15 +842,16 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
///
|
||||
/// This is a general case of origin propagation. For an Nary operation,
|
||||
/// is set to the origin of an argument that is not entirely initialized.
|
||||
/// If there is more than one such arguments, the rightmost of them is picked.
|
||||
/// It does not matter which one is picked if all arguments are initialized.
|
||||
void setOriginForNaryOp(Instruction &I) {
|
||||
if (!ClTrackOrigins) return;
|
||||
IRBuilder<> IRB(&I);
|
||||
Value *Origin = getOrigin(&I, 0);
|
||||
for (unsigned Op = 1, n = I.getNumOperands(); Op < n; ++Op) {
|
||||
Value *S = convertToShadowTyNoVec(getShadow(&I, Op - 1), IRB);
|
||||
Value *S = convertToShadowTyNoVec(getShadow(&I, Op), IRB);
|
||||
Origin = IRB.CreateSelect(IRB.CreateICmpNE(S, getCleanShadow(S)),
|
||||
Origin, getOrigin(&I, Op));
|
||||
getOrigin(&I, Op), Origin);
|
||||
}
|
||||
setOrigin(&I, Origin);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user