[llvm] Reapply "[msan] Switch switch() from strict handling to (icmp eq)-style handling" (#180636) (PR #181112)
Qinkun Bao via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 12 16:57:27 PST 2026
================
@@ -2460,6 +2460,64 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
return Si;
}
+ // Instrument:
+ // switch i32 %Val, label %else [ i32 0, label %A
+ // i32 1, label %B
+ // i32 2, label %C ]
+ //
+ // Typically, the switch input value (%Val) is fully initialized.
+ //
+ // Sometimes the compiler may convert (icmp + br) into a switch statement.
+ // MSan allows icmp eq/ne with partly initialized inputs to still result in a
+ // fully initialized output, if there exists a bit that is initialized in
+ // both inputs with a differing value. For compatibility, we support this in
+ // the switch instrumentation as well. Note that this edge case only applies
+ // if the switch input value does not match *any* of the cases (matching any
+ // of the cases requires an exact, fully initialized match).
+ //
+ // ShadowCases = 0
+ // | propagateEqualityComparison(Val, 0)
+ // | propagateEqualityComparison(Val, 1)
+ // | propagateEqualityComparison(Val, 2))
+ void visitSwitchInst(SwitchInst &SI) {
+ IRBuilder<> IRB(&SI);
+
+ Value *Val = SI.getCondition();
+ Value *ShadowVal = getShadow(Val);
+ // TODO: add fast path - if the condition is fully initialized, we know
+ // there is no UUM, without needing to consider the case values below.
+
+ // Some code (e.g., AMDGPUGenMCCodeEmitter.inc) has tens of thousands of
+ // cases. This results in an extremely long chained expression for MSan's
+ // switch instrumentation, which can cause the JumpThreadingPass to have a
+ // stack overflow or excessive runtime. We limit the number of cases
+ // considered, with the tradeoff of niche false negatives.
+ // TODO: figure out a better solution.
+ int casesToConsider = 99;
----------------
qinkunbao wrote:
It might be better to define 99 as a named constant (e.g., kMaxShadowCases) or even a cl::opt flag to allow tuning without recompilation if needed.
https://github.com/llvm/llvm-project/pull/181112
More information about the llvm-commits
mailing list