[MC/DC][Coverage] Loosen the limit of NumConds from 6 (#82448) · llvm/llvm-project@7ead2d8 (original) (raw)

`@@ -167,8 +167,6 @@ struct MapRegionCounters : public RecursiveASTVisitor {

`

167

167

` PGOHash Hash;

`

168

168

`/// The map of statements to counters.

`

169

169

` llvm::DenseMap<const Stmt *, unsigned> &CounterMap;

`

170

``

`-

/// The next bitmap byte index to assign.

`

171

``

`-

unsigned NextMCDCBitmapIdx;

`

172

170

`/// The state of MC/DC Coverage in this function.

`

173

171

` MCDC::State &MCDCState;

`

174

172

`/// Maximum number of supported MC/DC conditions in a boolean expression.

`

`@@ -183,7 +181,7 @@ struct MapRegionCounters : public RecursiveASTVisitor {

`

183

181

` MCDC::State &MCDCState, unsigned MCDCMaxCond,

`

184

182

` DiagnosticsEngine &Diag)

`

185

183

` : NextCounter(0), Hash(HashVersion), CounterMap(CounterMap),

`

186

``

`-

NextMCDCBitmapIdx(0), MCDCState(MCDCState), MCDCMaxCond(MCDCMaxCond),

`

``

184

`+

MCDCState(MCDCState), MCDCMaxCond(MCDCMaxCond),

`

187

185

` ProfileVersion(ProfileVersion), Diag(Diag) {}

`

188

186

``

189

187

`// Blocks and lambdas are handled as separate functions, so we need not

`

`@@ -314,11 +312,8 @@ struct MapRegionCounters : public RecursiveASTVisitor {

`

314

312

`return true;

`

315

313

` }

`

316

314

``

317

``

`-

// Otherwise, allocate the number of bytes required for the bitmap

`

318

``

`-

// based on the number of conditions. Must be at least 1-byte long.

`

319

``

`-

MCDCState.DecisionByStmt[BinOp].BitmapIdx = NextMCDCBitmapIdx;

`

320

``

`-

unsigned SizeInBits = std::max(1L << NumCond, CHAR_BIT);

`

321

``

`-

NextMCDCBitmapIdx += SizeInBits / CHAR_BIT;

`

``

315

`+

// Otherwise, allocate the Decision.

`

``

316

`+

MCDCState.DecisionByStmt[BinOp].BitmapIdx = 0;

`

322

317

` }

`

323

318

`return true;

`

324

319

` }

`

`@@ -1083,7 +1078,9 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) {

`

1083

1078

`// for most embedded applications. Setting a maximum value prevents the

`

1084

1079

`// bitmap footprint from growing too large without the user's knowledge. In

`

1085

1080

`// the future, this value could be adjusted with a command-line option.

`

1086

``

`-

unsigned MCDCMaxConditions = (CGM.getCodeGenOpts().MCDCCoverage) ? 6 : 0;

`

``

1081

`+

unsigned MCDCMaxConditions =

`

``

1082

`+

(CGM.getCodeGenOpts().MCDCCoverage ? CGM.getCodeGenOpts().MCDCMaxConds

`

``

1083

`+

: 0);

`

1087

1084

``

1088

1085

` RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);

`

1089

1086

` RegionMCDCState.reset(new MCDC::State);

`

`@@ -1099,7 +1096,6 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) {

`

1099

1096

` Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));

`

1100

1097

`assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");

`

1101

1098

` NumRegionCounters = Walker.NextCounter;

`

1102

``

`-

RegionMCDCState->BitmapBytes = Walker.NextMCDCBitmapIdx;

`

1103

1099

` FunctionHash = Walker.Hash.finalize();

`

1104

1100

`}

`

1105

1101

``

`@@ -1232,7 +1228,7 @@ void CodeGenPGO::emitMCDCParameters(CGBuilderTy &Builder) {

`

1232

1228

`// anything.

`

1233

1229

` llvm::Value *Args[3] = {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),

`

1234

1230

` Builder.getInt64(FunctionHash),

`

1235

``

`-

Builder.getInt32(RegionMCDCState->BitmapBytes)};

`

``

1231

`+

Builder.getInt32(RegionMCDCState->BitmapBits)};

`

1236

1232

` Builder.CreateCall(

`

1237

1233

` CGM.getIntrinsic(llvm::Intrinsic::instrprof_mcdc_parameters), Args);

`

1238

1234

`}

`

`@@ -1250,6 +1246,11 @@ void CodeGenPGO::emitMCDCTestVectorBitmapUpdate(CGBuilderTy &Builder,

`

1250

1246

`if (DecisionStateIter == RegionMCDCState->DecisionByStmt.end())

`

1251

1247

`return;

`

1252

1248

``

``

1249

`+

// Don't create tvbitmap_update if the record is allocated but excluded.

`

``

1250

`` +

// Or bitmap |= (1 << 0) would be wrongly executed to the next bitmap.

``

``

1251

`+

if (DecisionStateIter->second.Indices.size() == 0)

`

``

1252

`+

return;

`

``

1253

+

1253

1254

`// Extract the offset of the global bitmap associated with this expression.

`

1254

1255

`unsigned MCDCTestVectorBitmapOffset = DecisionStateIter->second.BitmapIdx;

`

1255

1256

`auto *I8PtrTy = llvm::PointerType::getUnqual(CGM.getLLVMContext());

`

`@@ -1261,7 +1262,7 @@ void CodeGenPGO::emitMCDCTestVectorBitmapUpdate(CGBuilderTy &Builder,

`

1261

1262

`// index represents an executed test vector.

`

1262

1263

` llvm::Value *Args[5] = {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),

`

1263

1264

` Builder.getInt64(FunctionHash),

`

1264

``

`-

Builder.getInt32(RegionMCDCState->BitmapBytes),

`

``

1265

`+

Builder.getInt32(0), // Unused

`

1265

1266

` Builder.getInt32(MCDCTestVectorBitmapOffset),

`

1266

1267

` MCDCCondBitmapAddr.emitRawPointer(CGF)};

`

1267

1268

` Builder.CreateCall(

`

`@@ -1305,19 +1306,22 @@ void CodeGenPGO::emitMCDCCondBitmapUpdate(CGBuilderTy &Builder, const Expr *S,

`

1305

1306

`// Extract the ID of the condition we are setting in the bitmap.

`

1306

1307

`const auto &Branch = BranchStateIter->second;

`

1307

1308

`assert(Branch.ID >= 0 && "Condition has no ID!");

`

``

1309

`+

assert(Branch.DecisionStmt);

`

1308

1310

``

1309

``

`-

auto *I8PtrTy = llvm::PointerType::getUnqual(CGM.getLLVMContext());

`

``

1311

`+

// Cancel the emission if the Decision is erased after the allocation.

`

``

1312

`+

const auto DecisionIter =

`

``

1313

`+

RegionMCDCState->DecisionByStmt.find(Branch.DecisionStmt);

`

``

1314

`+

if (DecisionIter == RegionMCDCState->DecisionByStmt.end())

`

``

1315

`+

return;

`

1310

1316

``

1311

``

`-

// Emit intrinsic that updates a dedicated temporary value on the stack after

`

1312

``

`-

// a condition is evaluated. After the set of conditions has been updated,

`

1313

``

`-

// the resulting value is used to update the boolean expression's bitmap.

`

1314

``

`-

llvm::Value *Args[5] = {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),

`

1315

``

`-

Builder.getInt64(FunctionHash),

`

1316

``

`-

Builder.getInt32(Branch.ID),

`

1317

``

`-

MCDCCondBitmapAddr.emitRawPointer(CGF), Val};

`

1318

``

`-

Builder.CreateCall(

`

1319

``

`-

CGM.getIntrinsic(llvm::Intrinsic::instrprof_mcdc_condbitmap_update),

`

1320

``

`-

Args);

`

``

1317

`+

const auto &TVIdxs = DecisionIter->second.Indices[Branch.ID];

`

``

1318

+

``

1319

`+

auto *CurTV = Builder.CreateLoad(MCDCCondBitmapAddr,

`

``

1320

`+

"mcdc." + Twine(Branch.ID + 1) + ".cur");

`

``

1321

`+

auto *NewTV = Builder.CreateAdd(CurTV, Builder.getInt32(TVIdxs[true]));

`

``

1322

`+

NewTV = Builder.CreateSelect(

`

``

1323

`+

Val, NewTV, Builder.CreateAdd(CurTV, Builder.getInt32(TVIdxs[false])));

`

``

1324

`+

Builder.CreateStore(NewTV, MCDCCondBitmapAddr);

`

1321

1325

`}

`

1322

1326

``

1323

1327

`void CodeGenPGO::setValueProfilingFlag(llvm::Module &M) {

`