@@ -1919,6 +1919,20 @@ llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
19191919 return MDHelper.createRange (Min, End);
19201920}
19211921
1922+ void CodeGenFunction::maybeAttachRangeForLoad (llvm::LoadInst *Load, QualType Ty,
1923+ SourceLocation Loc) {
1924+ if (EmitScalarRangeCheck (Load, Ty, Loc)) {
1925+ // In order to prevent the optimizer from throwing away the check, don't
1926+ // attach range metadata to the load.
1927+ } else if (CGM.getCodeGenOpts ().OptimizationLevel > 0 ) {
1928+ if (llvm::MDNode *RangeInfo = getRangeForLoadFromType (Ty)) {
1929+ Load->setMetadata (llvm::LLVMContext::MD_range, RangeInfo);
1930+ Load->setMetadata (llvm::LLVMContext::MD_noundef,
1931+ llvm::MDNode::get (CGM.getLLVMContext (), {}));
1932+ }
1933+ }
1934+ }
1935+
19221936bool CodeGenFunction::EmitScalarRangeCheck (llvm::Value *Value, QualType Ty,
19231937 SourceLocation Loc) {
19241938 bool HasBoolCheck = SanOpts.has (SanitizerKind::Bool);
@@ -2037,15 +2051,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
20372051
20382052 CGM.DecorateInstructionWithTBAA (Load, TBAAInfo);
20392053
2040- if (EmitScalarRangeCheck (Load, Ty, Loc)) {
2041- // In order to prevent the optimizer from throwing away the check, don't
2042- // attach range metadata to the load.
2043- } else if (CGM.getCodeGenOpts ().OptimizationLevel > 0 )
2044- if (llvm::MDNode *RangeInfo = getRangeForLoadFromType (Ty)) {
2045- Load->setMetadata (llvm::LLVMContext::MD_range, RangeInfo);
2046- Load->setMetadata (llvm::LLVMContext::MD_noundef,
2047- llvm::MDNode::get (getLLVMContext (), {}));
2048- }
2054+ maybeAttachRangeForLoad (Load, Ty, Loc);
20492055
20502056 return EmitFromMemory (Load, Ty);
20512057}
0 commit comments