forked from OSchip/llvm-project
				
			[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.
llvm-svn: 168887
			
			
This commit is contained in:
		
							parent
							
								
									93aefa5f2c
								
							
						
					
					
						commit
						f433cecf96
					
				| 
						 | 
					@ -842,15 +842,16 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
 | 
				
			||||||
  ///
 | 
					  ///
 | 
				
			||||||
  /// This is a general case of origin propagation. For an Nary operation,
 | 
					  /// 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.
 | 
					  /// 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.
 | 
					  /// It does not matter which one is picked if all arguments are initialized.
 | 
				
			||||||
  void setOriginForNaryOp(Instruction &I) {
 | 
					  void setOriginForNaryOp(Instruction &I) {
 | 
				
			||||||
    if (!ClTrackOrigins) return;
 | 
					    if (!ClTrackOrigins) return;
 | 
				
			||||||
    IRBuilder<> IRB(&I);
 | 
					    IRBuilder<> IRB(&I);
 | 
				
			||||||
    Value *Origin = getOrigin(&I, 0);
 | 
					    Value *Origin = getOrigin(&I, 0);
 | 
				
			||||||
    for (unsigned Op = 1, n = I.getNumOperands(); Op < n; ++Op) {
 | 
					    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 = IRB.CreateSelect(IRB.CreateICmpNE(S, getCleanShadow(S)),
 | 
				
			||||||
                                Origin, getOrigin(&I, Op));
 | 
					                                getOrigin(&I, Op), Origin);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    setOrigin(&I, Origin);
 | 
					    setOrigin(&I, Origin);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue