Skip to content

Refs/heads/split utage perf#746

Open
CJ362ff wants to merge 21 commits intoxs-devfrom
split-utage-perf
Open

Refs/heads/split utage perf#746
CJ362ff wants to merge 21 commits intoxs-devfrom
split-utage-perf

Conversation

@CJ362ff
Copy link
Collaborator

@CJ362ff CJ362ff commented Jan 30, 2026

Summary by CodeRabbit

  • Refactor

    • Reworked branch prediction to a richer, table-based MicroTAGE predictor with expanded tuning parameters for improved accuracy.
  • New Features

    • Added MicroTAGE as a selectable branch predictor and enabled it in example configurations.
  • Chores

    • Integrated MicroTAGE into the build and predictor selection.
  • Style

    • Minor non-functional comment placeholders added.

✏️ Tip: You can customize this high-level summary in your review settings.

Cao Jiaming added 19 commits January 28, 2026 11:06
Change-Id: I44b6175022a3a593ed385407bd95ec0c40c74642
Change-Id: I16ce79a7d8488d9a138d0a26f5500576ae54132e
Change-Id: I8be037a1cdacd7151f4fe8e743a32cca90a85036
Change-Id: I6b9c92c18c574a12c19532ae0b894e64c1187342
Change-Id: I953965b8e6feb1c15a238ac832d65bc16b32f496
Change-Id: I39cd471d452aa343c3dd741a80fdfa7d126e3a9f
Change-Id: I3567ae93652aac218c5b4646003abadddaf7cf32
Change-Id: If7c9d3aa68a23c36dde74d8cf3a286c9c48f3e3c
Change-Id: I83277ae5c801e9d22b594286580459d12cdec69b
Change-Id: I394246af184d3f07e02b85f06e4e5ceed368ec22
Change-Id: I762c11f8d15262fb9f1c9d443f77895fa76bbc79
Change-Id: Ia9bcdc028235447e254889d95e5ea98e7f067664
Change-Id: I56614e8ebc2dd33320d353562087ab456fc452da
Change-Id: Icdc7ac7f047a36dba6733a0e1d11e5e37aa4cdf1
Change-Id: I9cb7e7ef04efefbcbdbf705563563f50f3c83324
@coderabbitai
Copy link

coderabbitai bot commented Jan 30, 2026

📝 Walkthrough

Walkthrough

This PR adds a new MicroTAGE branch predictor implementation, exposes it as a TimedBaseBTBPredictor-derived SimObject, wires it into the build/BpType enum, and updates DecoupledBPUWithBTB and example configs to reference the new MicroTAGE type and parameters.

Changes

Cohort / File(s) Summary
Configs
configs/example/idealkmhv3.py, configs/example/kmhv3.py
Minor config edits: commented placeholder added in idealkmhv3.py; microtage.enabled toggled/enabled in kmhv3.py.
Predictor API & Build
src/cpu/pred/BranchPredictor.py, src/cpu/pred/SConscript
Replaced BTBTAGE-derived MicroTAGE with a TimedBaseBTBPredictor-based MicroTAGE type and expanded its public parameter surface; added MicroTAGE to BpType enum and included btb/microtage.cc in build.
DecoupledBPUWithBTB integration
src/cpu/pred/btb/decoupled_bpred.hh, src/cpu/pred/btb/decoupled_bpred.cc
Swapped member type from BTBTAGE*MicroTAGE*; reorganized includes (added microtage.hh, adjusted mbtb/btb_mgsc includes); inserted a small no-op/comment in tick().
MicroTAGE implementation
src/cpu/pred/btb/microtage.hh, src/cpu/pred/btb/microtage.cc
New header+source implementing a full MicroTAGE predictor: TAGE-style tables, folded-history handling, bank-aware indexing/updates, allocation/replacement logic, speculative/recovery APIs, stats, and unit-test scaffolding (large new code additions).

Sequence Diagram(s)

sequenceDiagram
    participant BTB as BTB Entry
    participant MTAGE as MicroTAGE Predictor
    participant Tables as TAGE Tables
    participant History as History Folding
    participant Update as Update Engine

    rect rgba(200, 150, 100, 0.5)
    Note over BTB,MTAGE: Prediction Path
    BTB->>MTAGE: putPCHistory(startPC, history)
    MTAGE->>History: Fold histories per table
    MTAGE->>Tables: Walk tables high→low (index/tag)
    Tables-->>MTAGE: Matching entries / counters
    MTAGE->>MTAGE: Select main prediction, form meta
    MTAGE-->>BTB: Return FullBTBPrediction (meta)
    end

    rect rgba(100, 150, 200, 0.5)
    Note over BTB,Update: Update Path
    BTB->>MTAGE: update(FetchStream with actual_taken)
    MTAGE->>MTAGE: Prepare update entries & recompute preds
    MTAGE->>Tables: Update counters/useful bits
    MTAGE->>Update: Check & perform allocation if needed
    Update->>Tables: Allocate/adjust replacement
    MTAGE->>History: Update folded histories
    end

    rect rgba(150, 200, 100, 0.5)
    Note over BTB,MTAGE: Recovery Path
    BTB->>MTAGE: recoverPHist(history, FetchStream)
    MTAGE->>History: Restore folded histories from checkpoint
    MTAGE-->>BTB: Histories restored
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

perf, align-kmhv3

Suggested reviewers

  • Yakkhini
  • jensen-yan

Poem

🐰 I folded history in a hop and a bound,
Tables stacked neatly — predictions abound.
Banks and tags chatter, counters hum low,
A tiny microtage helps branches grow. ✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 54.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Refs/heads/split utage perf' is vague and does not clearly convey the purpose of the changes, using non-descriptive terms that obscure the actual modifications. Replace with a descriptive title like 'Replace MicroTAGE base class from BTBTAGE to TimedBaseBTBPredictor' or 'Refactor MicroTAGE predictor implementation' to clearly communicate the main change.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch split-utage-perf

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Change-Id: I09779b2dbec44aaae1cae03a6e5366340a0cc9da
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Fix all issues with AI agents
In `@src/cpu/pred/btb/decoupled_bpred.cc`:
- Line 136: Replace the incomplete comment "//here need" with either a clear,
actionable comment explaining what's required at that spot (e.g., why a
particular operation is necessary, what invariant must hold, or what TODO
remains with expected behavior and a JIRA/issue ID) or simply remove it if no
note is needed; locate the comment near the decoupled branch predictor logic in
decoupled_bpred.cc (around the relevant function handling branch prediction) and
ensure the new comment references the specific reason or next step so future
readers understand intent.

In `@src/cpu/pred/btb/microtage.cc`:
- Around line 1063-1069: The code dereferences meta (auto meta =
std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()])) without
checking for null, which can crash on commit; add a null-guard after obtaining
meta (from stream.predMetas[getComponentIdx()]) and skip or set safe defaults
for uses of meta (e.g., when accessing meta->preds, meta->preds.find(pc), and
reading it->second.taken) if meta is null; ensure functions/methods using meta
such as the block that computes pc via inst->pcState().instAddr() and sets
pred_taken/pred_hit handle the null case consistently (e.g., leave
pred_taken=false and pred_hit=false or bail out) to avoid dereferencing a null
TageMeta.
- Around line 106-128: The loop assumes tableSizes[i] is a positive power-of-two
and tableTagBits[i] >= 1; add explicit validation before using them: check
tableSizes.size() and tableTagBits.size() as already asserted, then validate
that tableSizes[i] > 0 and is a power-of-two (or replace it with nextPowerOfTwo
if you prefer) before computing tableIndexBits and resizing tageTable[i], and
ensure tableTagBits[i] >= 1 before using tableTagBits[i]-1 for altTagFoldedHist;
if validation fails, assert or throw with a clear message. Also ensure
tableIndexBits[i] is computed from the validated size and use it to size
tableIndexMasks[i] and tableTagMasks[i] safely.
- Around line 192-256: The code currently calls main_info.taken()
unconditionally even when provided is false; change generation of main_taken to
only occur when provided is true by moving the call to main_info.taken() inside
the provided branch (use main_taken only when provided), e.g., compute
main_taken after the loop only if provided is true and otherwise avoid calling
TageTableInfo::taken(); also adjust the DPRINTF lines that reference main_taken
to use conditional values (or print only when provided) so no
unused/uninitialized variable is accessed; update the return to use the computed
values accordingly in generateSinglePrediction.
- Around line 738-769: The mask creation in getTageTag and getTageIndex is
unsafe when tableTagBits[t] or tableIndexBits[t] equals the address width
because `(1ULL << n)` is undefined for n==width; change the mask construction to
handle the full-width case defensively (e.g., if bits >= (sizeof(Addr)*8) use
all-ones mask, otherwise compute `(1ULL << bits) - 1`). Update constructions
that use `tableTagBits[t]` and `tableIndexBits[t]` so they never perform a
shift-by-width and ensure the mask type matches Addr.
- Around line 629-645: predMeta->preds[btb_entry.pc] can insert a default
TagePrediction and corrupt update logic when updateOnRead is false; change the
access in the loop over entries_to_update to first check
predMeta->preds.find(btb_entry.pc) and if not found call
generateSinglePrediction(btb_entry, startAddr, predMeta) (or otherwise fall back
to recomputation) so you only use stored predictions when the key exists; keep
using recomputed when updateOnRead is true or when the lookup fails, and
preserve existing variables (TagePrediction recomputed, utage_hit) and control
flow.

In `@src/cpu/pred/btb/microtage.hh`:
- Around line 4-9: The header is missing direct includes for types it uses: add
`#include` <memory> (for std::shared_ptr used throughout this file, e.g., in
declarations around symbol(s) using shared_ptr) and `#include` <unordered_map>
(for std::unordered_map used near the btb/microtage implementation) to the
top-of-file include list; this ensures the references to std::shared_ptr and
std::unordered_map are correct and not reliant on transitive headers.
🧹 Nitpick comments (1)
src/cpu/pred/btb/decoupled_bpred.hh (1)

18-28: Remove the duplicate btb_mgsc.hh include.

Line 20 adds cpu/pred/btb/btb_mgsc.hh, but it’s already present at Line 23. Keeping one avoids redundancy.

♻️ Suggested cleanup
-#include "cpu/pred/btb/btb_mgsc.hh"
 `#include` "cpu/pred/btb/btb_tage.hh"
 `#include` "cpu/pred/btb/btb_ubtb.hh"
 `#include` "cpu/pred/btb/btb_mgsc.hh"

tage->dryRunCycle(s0PC);
DPRINTF(Override, "Squashing, BPU state updated.\n");
squashing = false;
//here need
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clarify or remove the incomplete comment.

Line 136’s //here need reads like a half‑finished TODO; please replace it with an actionable note or remove it.

🧹 Suggested cleanup
-        //here need
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
//here need
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/decoupled_bpred.cc` at line 136, Replace the incomplete
comment "//here need" with either a clear, actionable comment explaining what's
required at that spot (e.g., why a particular operation is necessary, what
invariant must hold, or what TODO remains with expected behavior and a
JIRA/issue ID) or simply remove it if no note is needed; locate the comment near
the decoupled branch predictor logic in decoupled_bpred.cc (around the relevant
function handling branch prediction) and ensure the new comment references the
specific reason or next step so future readers understand intent.

Comment on lines +106 to +128
// Initialize base table for fallback predictions
for (unsigned int i = 0; i < numPredictors; ++i) {
//initialize ittage predictor
assert(tableSizes.size() >= numPredictors);
tageTable[i].resize(tableSizes[i]);
for (unsigned int j = 0; j < tableSizes[i]; ++j) {
tageTable[i][j].resize(numWays);
}

tableIndexBits[i] = ceilLog2(tableSizes[i]);
tableIndexMasks[i].resize(tableIndexBits[i], true);

assert(histLengths.size() >= numPredictors);

assert(tableTagBits.size() >= numPredictors);
tableTagMasks[i].resize(tableTagBits[i], true);

assert(tablePcShifts.size() >= numPredictors);

tagFoldedHist.push_back(PathFoldedHist((int)histLengths[i], (int)tableTagBits[i], 16));
altTagFoldedHist.push_back(PathFoldedHist((int)histLengths[i], (int)tableTagBits[i]-1, 16));
indexFoldedHist.push_back(PathFoldedHist((int)histLengths[i], (int)tableIndexBits[i], 16));
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Validate table sizes/tag bits before computing masks.

Index masking assumes power-of-two table sizes; non-power-of-two sizes can yield indices beyond tageTable[i]. Also tableTagBits[i]-1 requires tableTagBits[i] >= 1.

🛡️ Proposed guardrails
     for (unsigned int i = 0; i < numPredictors; ++i) {
         //initialize ittage predictor
         assert(tableSizes.size() >= numPredictors);
+        assert(tableSizes[i] > 0);
+        assert((tableSizes[i] & (tableSizes[i] - 1)) == 0); // power-of-two

         tageTable[i].resize(tableSizes[i]);
         for (unsigned int j = 0; j < tableSizes[i]; ++j) {
             tageTable[i][j].resize(numWays);
         }
@@
         assert(tableTagBits.size() >= numPredictors);
+        assert(tableTagBits[i] > 0);
         tableTagMasks[i].resize(tableTagBits[i], true);
🧰 Tools
🪛 Cppcheck (2.19.0)

[error] 119-119: Reference to temporary returned.

(returnTempReference)


[error] 125-125: Shifting 64-bit value by 64 bits is undefined behaviour

(shiftTooManyBits)

🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.cc` around lines 106 - 128, The loop assumes
tableSizes[i] is a positive power-of-two and tableTagBits[i] >= 1; add explicit
validation before using them: check tableSizes.size() and tableTagBits.size() as
already asserted, then validate that tableSizes[i] > 0 and is a power-of-two (or
replace it with nextPowerOfTwo if you prefer) before computing tableIndexBits
and resizing tageTable[i], and ensure tableTagBits[i] >= 1 before using
tableTagBits[i]-1 for altTagFoldedHist; if validation fails, assert or throw
with a clear message. Also ensure tableIndexBits[i] is computed from the
validated size and use it to size tableIndexMasks[i] and tableTagMasks[i]
safely.

Comment on lines +192 to +256
MicroTAGE::TagePrediction
MicroTAGE::generateSinglePrediction(const BTBEntry &btb_entry,
const Addr &startPC,
std::shared_ptr<TageMeta> predMeta) {
DPRINTF(TAGE, "generateSinglePrediction for btbEntry: %#lx\n", btb_entry.pc);

bool provided = false;
TageTableInfo main_info;

// Search from highest to lowest table for matches
// Calculate branch position within the block (like RTL's cfiPosition)
unsigned position = getBranchIndexInBlock(btb_entry.pc, startPC);

for (int i = numPredictors - 1; i >= 0; --i) {
// Calculate index and tag: use snapshot if provided, otherwise use current folded history
// Tag includes position XOR (like RTL: tag = tempTag ^ cfiPosition)
Addr index = predMeta ? getTageIndex(startPC, i, predMeta->indexFoldedHist[i].get())
: getTageIndex(startPC, i);
Addr tag = predMeta ? getTageTag(startPC, i,
predMeta->tagFoldedHist[i].get(),predMeta->altTagFoldedHist[i].get(), position)
: getTageTag(startPC, i, tagFoldedHist[i].get(),altTagFoldedHist[i].get(), position);

bool match = false; // for each table, only one way can be matched
TageEntry matching_entry;
unsigned matching_way = 0;

// Search all ways for a matching entry
for (unsigned way = 0; way < numWays; way++) {
auto &entry = tageTable[i][index][way];
// entry valid, tag match (position already encoded in tag, no need to check pc)
if (entry.valid && tag == entry.tag) {
matching_entry = entry;
matching_way = way;
match = true;

// Do not use LRU; keep logic simple and align with CBP-style replacement

DPRINTF(TAGE, "hit table %d[%lu][%u]: valid %d, tag %lu, ctr %d, useful %d, btb_pc %#lx, pos %u\n",
i, index, way, entry.valid, entry.tag, entry.counter, entry.useful, btb_entry.pc, position);
break; // only one way can be matched, aviod multi hit, TODO: RTL how to do this?
}
}

if (match) {
if (!provided) {
// First match becomes main prediction
main_info = TageTableInfo(true, matching_entry, i, index, tag, matching_way);
provided = true;
}
} else {
DPRINTF(TAGE, "miss table %d[%lu] for tag %lu (with pos %u), btb_pc %#lx\n",
i, index, tag, position, btb_entry.pc);
}
}

// Generate final prediction
bool main_taken = main_info.taken();
bool base_pred = btb_entry.ctr >= 0;

bool taken = provided ? main_taken : base_pred;

DPRINTF(TAGE, "tage predict %#lx taken %d\n", btb_entry.pc, taken);
DPRINTF(TAGE, "tage main prvided %d ? main_taken %d : base_taken %d\n", provided, main_taken, base_pred);

return TagePrediction(btb_entry.pc, main_info, provided, taken, base_pred);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

rg -n "TageTableInfo|taken\(" -A 5 src/cpu/pred/btb/microtage.hh

Repository: OpenXiangShan/GEM5

Length of output: 1896


🏁 Script executed:

rg -n "struct TageEntry" -A 15 src/cpu/pred/btb/microtage.hh

Repository: OpenXiangShan/GEM5

Length of output: 911


Avoid unnecessary taken() call when no provider is available.

main_info.taken() is called unconditionally, but its result is only used when provided is true. Move the call into the conditional to avoid the unnecessary function invocation.

Fix
-    bool main_taken = main_info.taken();
+    bool main_taken = provided ? main_info.taken() : false;
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.cc` around lines 192 - 256, The code currently
calls main_info.taken() unconditionally even when provided is false; change
generation of main_taken to only occur when provided is true by moving the call
to main_info.taken() inside the provided branch (use main_taken only when
provided), e.g., compute main_taken after the loop only if provided is true and
otherwise avoid calling TageTableInfo::taken(); also adjust the DPRINTF lines
that reference main_taken to use conditional values (or print only when
provided) so no unused/uninitialized variable is accessed; update the return to
use the computed values accordingly in generateSinglePrediction.

Comment on lines +629 to +645
auto predMeta = std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()]);
if (!predMeta) {
DPRINTF(TAGE, "update: no prediction meta, skip\n");
return;
}

bool utage_hit = false;
// Process each BTB entry
for (auto &btb_entry : entries_to_update) {
bool actual_taken = stream.exeTaken && stream.exeBranchInfo == btb_entry;
TagePrediction recomputed;
if (updateOnRead) { // if update on read is enabled, re-read providers using snapshot
// Re-read providers using snapshot (do not rely on prediction-time main/alt)
recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta);
} else { // otherwise, use the prediction from the prediction-time main/alt
recomputed = predMeta->preds[btb_entry.pc];
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Find the file and check its context
find . -name "microtage.cc" -type f

Repository: OpenXiangShan/GEM5

Length of output: 93


🏁 Script executed:

# Get more context around the lines in question
if [ -f "src/cpu/pred/btb/microtage.cc" ]; then
  wc -l src/cpu/pred/btb/microtage.cc
fi

Repository: OpenXiangShan/GEM5

Length of output: 96


🏁 Script executed:

# Read the section around lines 629-645
if [ -f "src/cpu/pred/btb/microtage.cc" ]; then
  sed -n '620,660p' src/cpu/pred/btb/microtage.cc
fi

Repository: OpenXiangShan/GEM5

Length of output: 1823


🏁 Script executed:

# Find the TageMeta class definition
find . -name "*.hh" -o -name "*.h" | head -20

Repository: OpenXiangShan/GEM5

Length of output: 526


🏁 Script executed:

# Search for TageMeta class definition
rg "class TageMeta" -A 20 -B 2

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Search more broadly for TageMeta
rg "TageMeta" -B 2 -A 10 --max-count 5

Repository: OpenXiangShan/GEM5

Length of output: 42393


🏁 Script executed:

# Look for header files in the pred/btb directory
find ./src/cpu/pred -name "*.hh" -o -name "*.h"

Repository: OpenXiangShan/GEM5

Length of output: 2418


🏁 Script executed:

# Get more complete context around the problematic lines
sed -n '629,660p' src/cpu/pred/btb/microtage.cc

Repository: OpenXiangShan/GEM5

Length of output: 1476


🏁 Script executed:

# Search for how recomputed is used after this assignment
sed -n '625,680p' src/cpu/pred/btb/microtage.cc

Repository: OpenXiangShan/GEM5

Length of output: 2657


🏁 Script executed:

# Check the header file to see the exact unordered_map type
grep -A 10 "struct TageMeta" src/cpu/pred/btb/microtage.hh

Repository: OpenXiangShan/GEM5

Length of output: 400


🏁 Script executed:

# Check what TagePrediction looks like when default-constructed
rg "struct TagePrediction" -A 20 src/cpu/pred/btb/

Repository: OpenXiangShan/GEM5

Length of output: 6076


🏁 Script executed:

# Check how recomputed is used in updatePredictorStateAndCheckAllocation
sed -n '1,100p' src/cpu/pred/btb/microtage.cc | grep -A 30 "bool updatePredictorStateAndCheckAllocation"

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Find the full implementation of updatePredictorStateAndCheckAllocation
rg "updatePredictorStateAndCheckAllocation" -A 15 src/cpu/pred/btb/microtage.cc | head -50

Repository: OpenXiangShan/GEM5

Length of output: 1509


🏁 Script executed:

# Check TageTableInfo to understand what's being used
rg "struct TageTableInfo" -A 10 src/cpu/pred/btb/

Repository: OpenXiangShan/GEM5

Length of output: 4237


🏁 Script executed:

# Check if there are other instances of preds[] usage in the codebase
rg "preds\[" src/cpu/pred/btb/ | grep -v "test" | head -20

Repository: OpenXiangShan/GEM5

Length of output: 771


🏁 Script executed:

# Check the documentation example to see the recommended pattern
cat src/cpu/pred/btb/docs/btb_tage.md | grep -A 20 "pred_it = meta->preds.find"

Repository: OpenXiangShan/GEM5

Length of output: 892


🏁 Script executed:

# Check if btb_tage.cc has the same issue
sed -n '620,650p' src/cpu/pred/btb/btb_tage.cc | grep -B 5 -A 5 "preds\["

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Look for the full context in btb_tage.cc around the problematic line
rg "recomputed = predMeta->preds" -B 10 -A 10 src/cpu/pred/btb/btb_tage.cc

Repository: OpenXiangShan/GEM5

Length of output: 1151


Use .find() to safely check for prediction metadata instead of inserting defaults.

When updateOnRead is disabled, predMeta->preds[btb_entry.pc] inserts a default TagePrediction if the key doesn't exist (e.g., for new BTB entries). The resulting object has mainInfo.found=false and mainprovided=false, which corrupts the update logic. Use safe lookup with .find() and fallback to recomputation for missing entries, consistent with the approach used in btb_tage.cc and the documented design:

Safer lookup
         } else { // otherwise, use the prediction from the prediction-time main/alt
-            recomputed = predMeta->preds[btb_entry.pc];
+            auto it = predMeta->preds.find(btb_entry.pc);
+            if (it != predMeta->preds.end()) {
+                recomputed = it->second;
+            } else {
+                // BTB miss/new entry: recompute from snapshot to avoid default insertion
+                recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta);
+            }
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
auto predMeta = std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()]);
if (!predMeta) {
DPRINTF(TAGE, "update: no prediction meta, skip\n");
return;
}
bool utage_hit = false;
// Process each BTB entry
for (auto &btb_entry : entries_to_update) {
bool actual_taken = stream.exeTaken && stream.exeBranchInfo == btb_entry;
TagePrediction recomputed;
if (updateOnRead) { // if update on read is enabled, re-read providers using snapshot
// Re-read providers using snapshot (do not rely on prediction-time main/alt)
recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta);
} else { // otherwise, use the prediction from the prediction-time main/alt
recomputed = predMeta->preds[btb_entry.pc];
}
auto predMeta = std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()]);
if (!predMeta) {
DPRINTF(TAGE, "update: no prediction meta, skip\n");
return;
}
bool utage_hit = false;
// Process each BTB entry
for (auto &btb_entry : entries_to_update) {
bool actual_taken = stream.exeTaken && stream.exeBranchInfo == btb_entry;
TagePrediction recomputed;
if (updateOnRead) { // if update on read is enabled, re-read providers using snapshot
// Re-read providers using snapshot (do not rely on prediction-time main/alt)
recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta);
} else { // otherwise, use the prediction from the prediction-time main/alt
auto it = predMeta->preds.find(btb_entry.pc);
if (it != predMeta->preds.end()) {
recomputed = it->second;
} else {
// BTB miss/new entry: recompute from snapshot to avoid default insertion
recomputed = generateSinglePrediction(btb_entry, startAddr, predMeta);
}
}
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.cc` around lines 629 - 645,
predMeta->preds[btb_entry.pc] can insert a default TagePrediction and corrupt
update logic when updateOnRead is false; change the access in the loop over
entries_to_update to first check predMeta->preds.find(btb_entry.pc) and if not
found call generateSinglePrediction(btb_entry, startAddr, predMeta) (or
otherwise fall back to recomputation) so you only use stored predictions when
the key exists; keep using recomputed when updateOnRead is true or when the
lookup fails, and preserve existing variables (TagePrediction recomputed,
utage_hit) and control flow.

Comment on lines +738 to +769
// Calculate TAGE tag with folded history - optimized version using bitwise operations
Addr
MicroTAGE::getTageTag(Addr pc, int t, uint64_t foldedHist, uint64_t altFoldedHist, Addr position)
{
// Create mask for tableTagBits[t] to limit result size
Addr mask = (1ULL << tableTagBits[t]) - 1;

// Extract lower bits of PC directly (remove instruction alignment bits)
Addr pcBits = (pc >> bankBaseShift) & mask;

// Extract and prepare folded history bits
Addr foldedBits = foldedHist & mask;

// Extract alt tag bits and shift left by 1
Addr altTagBits = (altFoldedHist << 1) & mask;

// XOR all components together, including position (like RTL)
return pcBits ^ foldedBits ^ position ^ altTagBits;
}

Addr
MicroTAGE::getTageIndex(Addr pc, int t, uint64_t foldedHist)
{
// Create mask for tableIndexBits[t] to limit result size
Addr mask = (1ULL << tableIndexBits[t]) - 1;

const unsigned pcShift = enableBankConflict ? indexShift : bankBaseShift;
Addr pcBits = (pc >> pcShift) & mask;
Addr foldedBits = foldedHist & mask;

return pcBits ^ foldedBits;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's examine the file at the specified lines
cat -n src/cpu/pred/btb/microtage.cc | sed -n '738,769p'

Repository: OpenXiangShan/GEM5

Length of output: 1401


🏁 Script executed:

# Find where tableTagBits and tableIndexBits are declared
rg -n "tableTagBits|tableIndexBits" src/cpu/pred/btb/microtage.cc | head -30

Repository: OpenXiangShan/GEM5

Length of output: 1010


🏁 Script executed:

# Search for the class definition to understand data members
rg -n "class MicroTAGE|std::vector.*tableTagBits|std::vector.*tableIndexBits" src/cpu/pred/btb/

Repository: OpenXiangShan/GEM5

Length of output: 665


🏁 Script executed:

# Check the header file for declarations
find src/cpu/pred/btb -name "*.hh" -o -name "*.h" | xargs rg -l "tableTagBits|tableIndexBits"

Repository: OpenXiangShan/GEM5

Length of output: 207


🏁 Script executed:

# Check Addr type definition
rg -n "typedef.*Addr|using Addr" src/cpu/pred/btb/microtage.hh | head -10

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Check the header file more completely for context
cat -n src/cpu/pred/btb/microtage.hh | sed -n '1,100p'

Repository: OpenXiangShan/GEM5

Length of output: 4112


🏁 Script executed:

# Look for PathFoldedHist to understand constraints
rg -n "class PathFoldedHist|PathFoldedHist(" src/cpu/pred/btb/microtage.hh | head -20

Repository: OpenXiangShan/GEM5

Length of output: 184


🏁 Script executed:

# Check for any range constraints or documentation on tableTagBits/tableIndexBits
rg -B5 -A5 "tableTagBits|tableIndexBits" src/cpu/pred/btb/microtage.hh | head -50

Repository: OpenXiangShan/GEM5

Length of output: 506


🏁 Script executed:

# Check the Addr type definition
find . -name "types.hh" -path "*/base/*" | head -5

Repository: OpenXiangShan/GEM5

Length of output: 107


🏁 Script executed:

# Read the types.hh file
cat src/base/types.hh | head -100

Repository: OpenXiangShan/GEM5

Length of output: 3483


🏁 Script executed:

# Search for ceilLog2 definition
rg -n "ceilLog2" src/ | head -20

Repository: OpenXiangShan/GEM5

Length of output: 1730


🏁 Script executed:

# Find the definition of ceilLog2
rg -n "ceilLog2" src/base/ | grep -E "^[^:]+:\s*(template|int|unsigned|uint)"

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Search for ceilLog2 definition more broadly
rg -B3 -A10 "^(int|unsigned|uint64_t|uint32_t).*ceilLog2|^template.*ceilLog2"

Repository: OpenXiangShan/GEM5

Length of output: 44


🏁 Script executed:

# Look in intmath.hh which is likely where bit utilities are
find src/base -name "*math*" -type f

Repository: OpenXiangShan/GEM5

Length of output: 106


🏁 Script executed:

# Check for bit/math utilities
rg -l "ceilLog2" src/base/

Repository: OpenXiangShan/GEM5

Length of output: 106


🏁 Script executed:

# Look at the ceilLog2 definition
cat src/base/intmath.hh | grep -A20 "ceilLog2"

Repository: OpenXiangShan/GEM5

Length of output: 443


🏁 Script executed:

# Check the Addr type definition to see its size
rg -A5 "typedef.*Addr|using.*Addr" src/base/types.hh

Repository: OpenXiangShan/GEM5

Length of output: 182


🏁 Script executed:

# Check tableTagBits default and parameter constraints
rg -B5 -A5 "tableTagBits|TTagBitSizes" src/cpu/pred/btb/microtage.cc | head -40

Repository: OpenXiangShan/GEM5

Length of output: 1350


🏁 Script executed:

# Check if there are any range checks or assertions on these values
rg -n "tableTagBits|tableIndexBits" src/cpu/pred/btb/microtage.cc | grep -E "assert|check|valid|range|max|min"

Repository: OpenXiangShan/GEM5

Length of output: 119


🏁 Script executed:

# Look for parameter definitions
rg -B3 -A3 "TTagBitSizes|tableTagBits.*param" src/

Repository: OpenXiangShan/GEM5

Length of output: 8778


🏁 Script executed:

# Check initialization in the constructor
cat -n src/cpu/pred/btb/microtage.cc | sed -n '55,130p'

Repository: OpenXiangShan/GEM5

Length of output: 3470


Guard against shift-by-width when building masks.

1ULL << tableTagBits[t] and 1ULL << tableIndexBits[t] are undefined if the shift count reaches the address width (64 bits for Addr). While current parameter configurations keep these values safely below 64 bits, the code is fragile to future configuration changes. Build masks defensively to prevent latent undefined behavior.

🧯 Defensive mask construction
 Addr
 MicroTAGE::getTageTag(Addr pc, int t, uint64_t foldedHist, uint64_t altFoldedHist, Addr position)
 {
-    // Create mask for tableTagBits[t] to limit result size
-    Addr mask = (1ULL << tableTagBits[t]) - 1;
+    const unsigned tagBits = tableTagBits[t];
+    const unsigned addrBits = sizeof(Addr) * 8;
+    Addr mask = (tagBits >= addrBits) ? ~Addr(0) : ((Addr(1) << tagBits) - 1);
@@
 Addr
 MicroTAGE::getTageIndex(Addr pc, int t, uint64_t foldedHist)
 {
-    // Create mask for tableIndexBits[t] to limit result size
-    Addr mask = (1ULL << tableIndexBits[t]) - 1;
+    const unsigned idxBits = tableIndexBits[t];
+    const unsigned addrBits = sizeof(Addr) * 8;
+    Addr mask = (idxBits >= addrBits) ? ~Addr(0) : ((Addr(1) << idxBits) - 1);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Calculate TAGE tag with folded history - optimized version using bitwise operations
Addr
MicroTAGE::getTageTag(Addr pc, int t, uint64_t foldedHist, uint64_t altFoldedHist, Addr position)
{
// Create mask for tableTagBits[t] to limit result size
Addr mask = (1ULL << tableTagBits[t]) - 1;
// Extract lower bits of PC directly (remove instruction alignment bits)
Addr pcBits = (pc >> bankBaseShift) & mask;
// Extract and prepare folded history bits
Addr foldedBits = foldedHist & mask;
// Extract alt tag bits and shift left by 1
Addr altTagBits = (altFoldedHist << 1) & mask;
// XOR all components together, including position (like RTL)
return pcBits ^ foldedBits ^ position ^ altTagBits;
}
Addr
MicroTAGE::getTageIndex(Addr pc, int t, uint64_t foldedHist)
{
// Create mask for tableIndexBits[t] to limit result size
Addr mask = (1ULL << tableIndexBits[t]) - 1;
const unsigned pcShift = enableBankConflict ? indexShift : bankBaseShift;
Addr pcBits = (pc >> pcShift) & mask;
Addr foldedBits = foldedHist & mask;
return pcBits ^ foldedBits;
}
// Calculate TAGE tag with folded history - optimized version using bitwise operations
Addr
MicroTAGE::getTageTag(Addr pc, int t, uint64_t foldedHist, uint64_t altFoldedHist, Addr position)
{
// Create mask for tableTagBits[t] to limit result size
const unsigned tagBits = tableTagBits[t];
const unsigned addrBits = sizeof(Addr) * 8;
Addr mask = (tagBits >= addrBits) ? ~Addr(0) : ((Addr(1) << tagBits) - 1);
// Extract lower bits of PC directly (remove instruction alignment bits)
Addr pcBits = (pc >> bankBaseShift) & mask;
// Extract and prepare folded history bits
Addr foldedBits = foldedHist & mask;
// Extract alt tag bits and shift left by 1
Addr altTagBits = (altFoldedHist << 1) & mask;
// XOR all components together, including position (like RTL)
return pcBits ^ foldedBits ^ position ^ altTagBits;
}
Addr
MicroTAGE::getTageIndex(Addr pc, int t, uint64_t foldedHist)
{
// Create mask for tableIndexBits[t] to limit result size
const unsigned idxBits = tableIndexBits[t];
const unsigned addrBits = sizeof(Addr) * 8;
Addr mask = (idxBits >= addrBits) ? ~Addr(0) : ((Addr(1) << idxBits) - 1);
const unsigned pcShift = enableBankConflict ? indexShift : bankBaseShift;
Addr pcBits = (pc >> pcShift) & mask;
Addr foldedBits = foldedHist & mask;
return pcBits ^ foldedBits;
}
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.cc` around lines 738 - 769, The mask creation in
getTageTag and getTageIndex is unsafe when tableTagBits[t] or tableIndexBits[t]
equals the address width because `(1ULL << n)` is undefined for n==width; change
the mask construction to handle the full-width case defensively (e.g., if bits
>= (sizeof(Addr)*8) use all-ones mask, otherwise compute `(1ULL << bits) - 1`).
Update constructions that use `tableTagBits[t]` and `tableIndexBits[t]` so they
never perform a shift-by-width and ensure the mask type matches Addr.

Comment on lines +1063 to +1069
auto meta = std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()]);
auto pc = inst->pcState().instAddr();
auto it = meta->preds.find(pc);
bool pred_taken = false;
bool pred_hit = false;
if (it != meta->preds.end()) {
pred_taken = it->second.taken;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Guard against null prediction metadata before use.

meta can be null; dereferencing it will crash on commit in that case.

🧷 Null-guard
     auto meta = std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()]);
+    if (!meta) {
+        return;
+    }
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.cc` around lines 1063 - 1069, The code
dereferences meta (auto meta =
std::static_pointer_cast<TageMeta>(stream.predMetas[getComponentIdx()])) without
checking for null, which can crash on commit; add a null-guard after obtaining
meta (from stream.predMetas[getComponentIdx()]) and skip or set safe defaults
for uses of meta (e.g., when accessing meta->preds, meta->preds.find(pc), and
reading it->second.taken) if meta is null; ensure functions/methods using meta
such as the block that computes pc via inst->pcState().instAddr() and sets
pred_taken/pred_hit handle the null case consistently (e.g., leave
pred_taken=false and pred_hit=false or bail out) to avoid dereferencing a null
TageMeta.

Comment on lines +4 to +9
#include <cstdint>
#include <deque>
#include <map>
#include <utility>
#include <vector>

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the actual includes at lines 4-9
echo "=== Current includes (lines 4-9) ==="
sed -n '4,9p' src/cpu/pred/btb/microtage.hh

echo -e "\n=== Full include section ==="
head -20 src/cpu/pred/btb/microtage.hh

echo -e "\n=== Check for shared_ptr usage ==="
rg -n 'shared_ptr' src/cpu/pred/btb/microtage.hh

echo -e "\n=== Check for unordered_map usage ==="
rg -n 'unordered_map' src/cpu/pred/btb/microtage.hh

echo -e "\n=== Check for memory/unordered_map includes ==="
rg -n '#include <memory>|#include <unordered_map>' src/cpu/pred/btb/microtage.hh

Repository: OpenXiangShan/GEM5

Length of output: 1203


Add missing standard headers for shared_ptr and unordered_map.

The file uses std::shared_ptr (line 44 and others) and std::unordered_map (line 384), but lacks the required <memory> and <unordered_map> headers. Relying on transitive includes is brittle and leads to fragile code.

Suggested include fix
 `#include` <cstdint>
 `#include` <deque>
 `#include` <map>
+#include <memory>
+#include <unordered_map>
 `#include` <utility>
 `#include` <vector>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#include <cstdint>
#include <deque>
#include <map>
#include <utility>
#include <vector>
`#include` <cstdint>
`#include` <deque>
`#include` <map>
`#include` <memory>
`#include` <unordered_map>
`#include` <utility>
`#include` <vector>
🤖 Prompt for AI Agents
In `@src/cpu/pred/btb/microtage.hh` around lines 4 - 9, The header is missing
direct includes for types it uses: add `#include` <memory> (for std::shared_ptr
used throughout this file, e.g., in declarations around symbol(s) using
shared_ptr) and `#include` <unordered_map> (for std::unordered_map used near the
btb/microtage implementation) to the top-of-file include list; this ensures the
references to std::shared_ptr and std::unordered_map are correct and not reliant
on transitive headers.

Change-Id: If50663e7dd3ca7f48f53d9070a65cfb7d53b4513
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/cpu/pred/BranchPredictor.py`:
- Around line 1063-1089: The MicroTAGE Python config declares parameters not
used by its C++ constructor; remove the unused Param entries baseTableSize,
enableSC, useAltOnNaSize, and useAltOnNaWidth from the MicroTAGE class so the
Python and C++ interfaces match. Edit the MicroTAGE class (symbols: MicroTAGE,
needMoreHistories, updateOnRead, numPredictors, tableSizes, TTagBitSizes,
TTagPcShifts, histLengths, maxHistLen, numWays, maxBranchPositions,
numTablesToAlloc, numBanks, blockSize, enableBankConflict, numDelay) and delete
the four Param.* lines for baseTableSize, enableSC, useAltOnNaSize, and
useAltOnNaWidth leaving only the actual constructor-backed parameters listed in
the review.

Comment on lines +1063 to +1089
class MicroTAGE(TimedBaseBTBPredictor):
"""Micro-sized BTB TAGE predictor used alongside uBTB"""
type = 'MicroTAGE'
cxx_class = 'gem5::branch_prediction::btb_pred::MicroTAGE'
cxx_header = "cpu/pred/btb/microtage.hh"

needMoreHistories = Param.Bool(True, "MicroTAGE needs more histories")
enableSC = Param.Bool(False, "Enable SC or not")
updateOnRead = Param.Bool(True,"Enable update on read, no need to save tage meta in FTQ")
# Keep vector parameters consistent with numPredictors to avoid constructor asserts.
numPredictors = Param.Unsigned(1, "Number of TAGE predictors")
tableSizes = VectorParam.Unsigned([512],"the TAGE T0~Tn length")
TTagBitSizes = VectorParam.Unsigned([16] ,"the T0~Tn entry's tag bit size")
TTagPcShifts = VectorParam.Unsigned([1] ,"when the T0~Tn entry's tag generating, PC right shift")
blockSize = Param.Unsigned(32,"tage index function uses 32B aligned block address")

histLengths = VectorParam.Unsigned([16],"the BTB TAGE T0~Tn history length")
maxHistLen = Param.Unsigned(970,"The length of history passed from DBP")
numTablesToAlloc = Param.Unsigned(1,"The number of table to allocated each time")
numWays = Param.Unsigned(2, "Number of ways per set")
baseTableSize = Param.Unsigned(256,"Base table size")
maxBranchPositions = Param.Unsigned(32,"Maximum branch positions per 64-byte block")
useAltOnNaSize = Param.Unsigned(128,"Size of the useAltOnNa table")
useAltOnNaWidth = Param.Unsigned(7,"Width of the useAltOnNa table")
numBanks = Param.Unsigned(4,"Number of banks for bank conflict simulation")
enableBankConflict = Param.Bool(False,"Enable bank conflict simulation")
numDelay = Param.Unsigned(0,"Prediction latency in cycles")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for baseTableSize usage in the codebase
echo "=== Searching for baseTableSize in all files ==="
rg -n 'baseTableSize' --type cpp --type-add 'cpp:*.cc' --type-add 'cpp:*.hh' 2>/dev/null || echo "No matches found"

echo ""
echo "=== Looking for microtage files ==="
fd -e 'cc' -e 'hh' | grep -i microtage

echo ""
echo "=== Searching for p.baseTableSize pattern ==="
rg -n 'p\.baseTableSize' 2>/dev/null || echo "No matches found"

Repository: OpenXiangShan/GEM5

Length of output: 524


🏁 Script executed:

#!/bin/bash
# Check the MicroTAGE constructor to see what parameters are actually consumed
echo "=== Searching for MicroTAGE constructor in microtage.cc ==="
rg -A 80 'MicroTAGE::MicroTAGE' src/cpu/pred/btb/microtage.cc | head -100

echo ""
echo "=== Checking which p. parameters are accessed in microtage.cc ==="
rg -n 'p\.' src/cpu/pred/btb/microtage.cc | head -20

Repository: OpenXiangShan/GEM5

Length of output: 4409


Remove unused parameters from MicroTAGE configuration.

The C++ constructor uses only a subset of the declared parameters. The following parameters are not accessed in the MicroTAGE implementation and should be removed from the Python configuration:

  • baseTableSize (line 1083)
  • enableSC (line 1070)
  • useAltOnNaSize (line 1086)
  • useAltOnNaWidth (line 1087)

These appear to be copy-pasted from other predictor classes (likely BTBTAGE) but are not integrated into MicroTAGE's C++ implementation. The actual constructor parameters used are: numPredictors, tableSizes, TTagBitSizes, TTagPcShifts, histLengths, maxHistLen, numWays, maxBranchPositions, numTablesToAlloc, updateOnRead, numBanks, blockSize, enableBankConflict, and needMoreHistories.

🧰 Tools
🪛 Ruff (0.14.14)

[error] 1069-1069: Param may be undefined, or defined from star imports

(F405)


[error] 1070-1070: Param may be undefined, or defined from star imports

(F405)


[error] 1071-1071: Param may be undefined, or defined from star imports

(F405)


[error] 1073-1073: Param may be undefined, or defined from star imports

(F405)


[error] 1074-1074: VectorParam may be undefined, or defined from star imports

(F405)


[error] 1075-1075: VectorParam may be undefined, or defined from star imports

(F405)


[error] 1076-1076: VectorParam may be undefined, or defined from star imports

(F405)


[error] 1077-1077: Param may be undefined, or defined from star imports

(F405)


[error] 1079-1079: VectorParam may be undefined, or defined from star imports

(F405)


[error] 1080-1080: Param may be undefined, or defined from star imports

(F405)


[error] 1081-1081: Param may be undefined, or defined from star imports

(F405)


[error] 1082-1082: Param may be undefined, or defined from star imports

(F405)


[error] 1083-1083: Param may be undefined, or defined from star imports

(F405)


[error] 1084-1084: Param may be undefined, or defined from star imports

(F405)


[error] 1085-1085: Param may be undefined, or defined from star imports

(F405)


[error] 1086-1086: Param may be undefined, or defined from star imports

(F405)


[error] 1087-1087: Param may be undefined, or defined from star imports

(F405)


[error] 1088-1088: Param may be undefined, or defined from star imports

(F405)


[error] 1089-1089: Param may be undefined, or defined from star imports

(F405)

🤖 Prompt for AI Agents
In `@src/cpu/pred/BranchPredictor.py` around lines 1063 - 1089, The MicroTAGE
Python config declares parameters not used by its C++ constructor; remove the
unused Param entries baseTableSize, enableSC, useAltOnNaSize, and
useAltOnNaWidth from the MicroTAGE class so the Python and C++ interfaces match.
Edit the MicroTAGE class (symbols: MicroTAGE, needMoreHistories, updateOnRead,
numPredictors, tableSizes, TTagBitSizes, TTagPcShifts, histLengths, maxHistLen,
numWays, maxBranchPositions, numTablesToAlloc, numBanks, blockSize,
enableBankConflict, numDelay) and delete the four Param.* lines for
baseTableSize, enableSC, useAltOnNaSize, and useAltOnNaWidth leaving only the
actual constructor-backed parameters listed in the review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant