You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit f38e981
Browse filesBrowse the repository at this point in the historyBrowse files
Four pure sNaN-quieting losses (#112, #115, #116, #117) — known LLVM
limitation, not worth filing in isolation.
Three "poison → concrete value" folds (#123, #156, #247) — LangRef
explicitly permits this: "It is correct to replace a poison value
with an undef value or any value of the type."
Removes the bug dirs, the 7 candidate files that map to them, and
updates TRIAGE.md/README.md/workers/COVERAGE.md counts and refs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: x86/README.md
+2-9Lines changed: 2 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ Everything below here is machine-generated. Good luck.
15
15
16
16
Goal: find ≥100 real bugs in the x86 path through the default LLVM pass pipeline.
17
17
18
-
**Status: 152 reproducible bugs (well past the 100 goal). 253 total catalog entries (~100 are source-confirmed only). 484+ pending candidate notes in `candidates/` not yet promoted.**
18
+
**Status: 145 reproducible bugs (well past the 100 goal). 246 total catalog entries (~100 are source-confirmed only). 484+ pending candidate notes in `candidates/` not yet promoted.**
| 114 |[114-gvnsink-merges-volatile-stores](bugs/114-gvnsink-merges-volatile-stores/)| GVNSink ValueTable | volatile is included in expression hash; two equivalent volatile stores merged across branches into one sunk store | confirmed (opt diff) |
164
-
| 115 |[115-simplifyfpbinop-snan-quieting-bypass-fmul](bugs/115-simplifyfpbinop-snan-quieting-bypass-fmul/)| SelectionDAG::simplifyFPBinop |`fmul X,1.0` / `fdiv X,1.0` fold to bare `retq` with no `nnan` check; sNaN bit-pattern + exception elided | confirmed (asm) |
165
-
| 116 |[116-simplifyfpbinop-snan-quieting-bypass-fadd-neg0](bugs/116-simplifyfpbinop-snan-quieting-bypass-fadd-neg0/)| SelectionDAG::simplifyFPBinop |`fadd X,-0.0` / `fsub X,+0.0` likewise fold to `retq` (sister of #115) | confirmed (asm) |
166
-
| 117 |[117-fdiv-neg1-snan-passthrough-via-xorps](bugs/117-fdiv-neg1-snan-passthrough-via-xorps/)| DAGCombiner visitFDIV→visitFMUL→visitFSUB |`fdiv X,-1.0` lowers to bare `xorps sign-mask` (no `divsd`); in-source FIXME at line 19057 | confirmed (asm) |
167
163
| 118 |[118-sroa-drops-atomic-ordering](bugs/118-sroa-drops-atomic-ordering/)| Transforms/Scalar/SROA | predicate `if (LI.isVolatile()) NewLI->setAtomic(...)` should be `isAtomic()`; atomic seq_cst load/store reduced to plain access | confirmed (opt diff) |
| 120 |[120-simplifycfg-sink-merges-volatile-stores](bugs/120-simplifycfg-sink-merges-volatile-stores/)| SimplifyCFG SinkCommonCodeFromPredecessors | two volatile stores in mutually-exclusive branches sunk into one select+volatile-store; static count 2→1 violates LangRef volatile invariant | confirmed (opt diff) |
170
166
| 121 |[121-simplifycfg-hoist-merges-volatile-loads](bugs/121-simplifycfg-hoist-merges-volatile-loads/)| SimplifyCFG hoistCommonCodeFromSuccessors | two volatile loads in mutually-exclusive branches hoisted to one unconditional volatile load | confirmed (opt diff) |
171
167
| 122 |[122-simplifycfg-hoist-merges-seqcst-atomic-loads](bugs/122-simplifycfg-hoist-merges-seqcst-atomic-loads/)| SimplifyCFG hoistCommonCodeFromSuccessors | two `seq_cst` atomic loads in branches hoisted to one unconditional load; conditional→unconditional changes C++ S total order | confirmed (opt diff) |
172
-
| 123 |[123-instcombine-constfold-nnan-ninf-returns-nan-inf-not-poison](bugs/123-instcombine-constfold-nnan-ninf-returns-nan-inf-not-poison/)| InstCombine ConstantFoldFPInstOperands | nnan/ninf FP op with NaN/Inf result folds to NaN/Inf constant instead of `poison` (LangRef: nnan+NaN result → poison) | confirmed (opt diff) |
| 125 |[125-atomic-expand-store-to-xchg-drops-volatile-syncscope](bugs/125-atomic-expand-store-to-xchg-drops-volatile-syncscope/)| AtomicExpandPass expandAtomicStoreToXChg | i128 atomic-volatile store with `singlethread` → cmpxchg loop without volatile + system-scope; also inserts a bare non-volatile load of the dst | confirmed (mir diff) |
175
170
| 126 |[126-licm-promote-drops-syncscope](bugs/126-licm-promote-drops-syncscope/)| LICM promoteLoopAccessesToScalars | preheader load and exit-block store dropped from `syncscope("singlethread")` to default System scope | confirmed (opt diff) |
@@ -202,7 +197,6 @@ Most reproducible bugs fall in: metadata loss (`!nontemporal`, `!invariant.load`
202
197
| 153 |[153-dse-dominating-condition-drops-nontemporal](bugs/153-dse-dominating-condition-drops-nontemporal/)| DSE dominating-condition store merging | dropped `!nontemporal` on merged stores | confirmed (opt diff) |
203
198
| 154 |[154-simplifycfg-sink-merges-two-volatile-seqcst-atomicrmw](bugs/154-simplifycfg-sink-merges-two-volatile-seqcst-atomicrmw/)| SimplifyCFG SinkCommonCodeFromPredecessors | volatile seq_cst `atomicrmw` instructions in mutually-exclusive branches sunk into one (sibling of #152) | confirmed (opt diff) |
| 159 |[159-sroa-phi-speculate-picks-aa-from-one-user](bugs/159-sroa-phi-speculate-picks-aa-from-one-user/)| SROA PHI speculation | AA tag picked from one user of the speculated PHI, applied to merged load — wrong for other users | confirmed (opt diff) |
@@ -293,7 +287,6 @@ Most reproducible bugs fall in: metadata loss (`!nontemporal`, `!invariant.load`
Copy file name to clipboardExpand all lines: x86/TRIAGE.md
+6-17Lines changed: 6 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,8 @@
1
1
# Triage by Severity (upstream-impact focused)
2
2
3
-
253 catalog entries. 152 reproducible at default x86 -O2. ~100 source-confirmed only. Tiers below assigned by user-visible impact when the bug fires. Within each tier the bugs are ordered by "report-first" priority.
3
+
246 catalog entries. 145 reproducible at default x86 -O2. ~100 source-confirmed only. Tiers below assigned by user-visible impact when the bug fires. Within each tier the bugs are ordered by "report-first" priority.
4
+
5
+
(7 S2 entries previously listed have been removed: four pure sNaN-quieting losses (112, 115, 116, 117) — known LLVM limitation, not worth filing — and three "poison → concrete value" folds (123, 156, 247), which the LangRef explicitly permits: *"It is correct to replace a poison value with an undef value or any value of the type."*)
|**233**| ConstantFolding `llvm.fmuladd` folded as FMA, x86 lowers as `mulsd;addsd`| same IR yields `2^-104` (compile-time fold) vs `0.0` (runtime). Real value divergence visible by toggling constness. |
30
32
|**003 / 110**| X86 GISel UADDE / USUBE inverted carry on multi-word add/sub | wrong upper word — only fires with `-global-isel` (NOT default on x86) |
31
33
32
-
## S2 — Alive2-falsifiable poison/refinement miscompiles (~22) — turns defined value into poison, or over-infers a flag that makes downstream code poison
34
+
## S2 — Alive2-falsifiable poison/refinement miscompiles (~20) — turns defined value into poison, or over-infers a flag that makes downstream code poison
33
35
34
36
These are the strongest correctness-class non-runtime bugs. Several are already-known patterns getting independent confirmation; others are net-new.
35
37
@@ -48,23 +50,11 @@ These are the strongest correctness-class non-runtime bugs. Several are already-
|**246**| ConstantFolding `ldexp.f64.i64(1.0, 4294967330)`| folds to `2^34` instead of `+inf`; sibling of #011 in const-fold rather than libcall expand |
51
-
|**247**| ConstantFolding `bitcast <i16 0, i16 poison> to i32`| treats poison lane as 0 — downstream `icmp eq , 0` → `true` instead of `poison`|
52
53
|**248**| InstCombine `foldSelectIntoOp` ninf mis-propagation |`select c, fmul ninf(x,y), x` → `fmul (select ninf c, y, 1.0), x`; for x=0,y=+inf,c=true source returns NaN, new select returns +inf → poison |
53
54
|**251**| CVP undef-tainted lattice |`select i1 %cmp, i64 undef, i64 1` taints lattice → CVP adds `range(i64 1,3)` AND `add nuw nsw`; both unsound for undef=INT_MAX (matches upstream #114902) |
54
55
|**252**| JumpThreading `unfoldSelectInstr` branches on poison | original uses `freeze`; after JT, freeze is gone and `br i1 %maybe_poison` → UB |
55
56
|**253**| InstCombine `foldAddLikeCommutative`|`or disjoint (add nsw A,5), (B&250)` → `add nsw A, (or B,5)`; disjoint only proves no unsigned carry, not signed — for a=100,b=130 source returns -21, target → poison |
@@ -189,11 +179,10 @@ Annotated with upstream-issue status as of 2026-05-21:
189
179
|**206**|`fmod(NaN)` → poison via mis-named `IsNoNan`| No duplicate. **Novel.**| File |
190
180
|**207**|`fdim(±Inf,±Inf)` → qNaN | No duplicate. **Novel.**| File |
191
181
|**236**| ashr exact → lshr exact anti-refinement | No duplicate. **Novel** (in-tree test `ashr_can_be_lshr` bakes in the buggy output and needs updating with the fix) | File |
|**251**| CVP undef-tainted lattice |**Duplicate**: open issue [#114902](https://github.com/llvm/llvm-project/issues/114902), still open and unfixed | Comment on existing issue with our `add nuw nsw` additional case |
194
183
|**240**| X86 stack-probe skips one-page alloca | No duplicate. **Novel** (security mitigation defeated under `-fstack-clash-protection`) | File |
195
184
|**253**| InstCombine `foldAddLikeCommutative` over-infers nsw from `or disjoint`| No duplicate. **Novel.**| File |
196
185
197
-
**Net actionable**: 10 novel issues to file + 2 to comment on existing. The 2 duplicates (#071#251) are both already known, so they don't need new issues — adding our reproducers as comments still has value.
186
+
**Net actionable**: 9 novel issues to file + 2 to comment on existing. The 2 duplicates (#071#251) are both already known, so they don't need new issues — adding our reproducers as comments still has value.
198
187
199
188
Then in S3 batch, the most upstream-friendly cluster is the **shared-helper class** of fixes — see `ROOT_CAUSE_PATCHES.md`: 7 PRs in ~225 lines of code close ~40 of the ~85 S6 metadata-loss bugs.
0 commit comments