Issue 185365
Summary [MC][X86] Clang crashes when assembling x86-64 AVX-512 `vfpclassbf16` with Intel-syntax OFFSET symbol
Labels clang
Assignees
Reporter venkyqz
    ## Summary

`llvm-mc` (debug build) crashes with an assertion failure when assembling AVX10.2 BF16 floating-point classification instruction `vfpclassbf16` with Intel-syntax `OFFSET sym` as the category-mask immediate. The release build silently accepts the input.

---

## Reproduction

**Godbolt Link**
+ https://godbolt.org/z/ToY1Mh9vx

**Test File (`poc.s`):**

```asm
.intel_syntax noprefix
vfpclassbf16 k0, xmm0, OFFSET sym
```

**Commands:**

```bash
# Debug Build - Crashes with assertion
cat > /tmp/poc.s << 'EOF'
.intel_syntax noprefix
vfpclassbf16 k0, xmm0, OFFSET sym
EOF
llvm-mc - --triple=x86_64-unknown-linux-gnu \
 -x86-asm-syntax=intel \
 -mattr=+avx512f,+avx512dq,+avx512vl,+avx10.2,+avx10.2-512 -filetype=asm \
 /tmp/poc.s
# Exit 134, Assertion failed

# Release Build - Silent acceptance
llvm-mc - --triple=x86_64-unknown-linux-gnu \
 -x86-asm-syntax=intel \
 -mattr=+avx512f,+avx512dq,+avx512vl,+avx10.2,+avx10.2-512 -filetype=asm \
 /tmp/poc.s
# Exit 0
```

**Debug Build Output:**

```
Assertion `isImm() && "This is not an immediate"' failed.
UNREACHABLE executed at .../llvm/include/llvm/MC/MCInst.h:85
```

---

## Root Cause

Intel syntax `OFFSET sym` creates an `MCSymbolRefExpr` that bypasses parser immediate-range validation. The MCOperand is typed as `Expr` (not `Imm`), so `isImm()` returns false.

The crash occurs at `X86InstComments.cpp:1034`:

```cpp
CASE_FPCLASS_PACKED(FPCLASSBF16, r)
CASE_FPCLASS_PACKED(FPCLASSPH, r)
CASE_FPCLASS_PACKED(FPCLASSPS, r)
... {
  // NOT guarded by isImm() check!
  uint8_t Categories = MI->getOperand(NumOperands - 1).getImm(); // line 1034
```

**Why some variants don't crash:** XMM/YMM masked variants (`VFPCLASSBF16Z128rik`, `VFPCLASSBF16Z256rik`) are not in the switch and fall through to `default: return false`, never calling `getImm()`.

---

## Impact

| Build Type | Behavior | Security Risk |
|------------|----------|---------------|
| Debug | Assertion failure (Exit 134) | Detectable |
| Release | Silent acceptance (Exit 0) | **Undetectable in CI/CD** |

**Affected Instructions (debug=134, release=0):**

| Instruction | Opcode |
|-------------|--------|
| `vfpclassbf16 k0, xmm0, OFFSET sym` | VFPCLASSBF16Z128ri |
| `vfpclassbf16 k0, ymm0, OFFSET sym` | VFPCLASSBF16Z256ri |
| `vfpclassbf16 k0, zmm0, OFFSET sym` | VFPCLASSBF16Zri |
| `vfpclassbf16 k0 {k1}, zmm0, OFFSET sym` | VFPCLASSBF16Zrik |

**Not Affected (db=0, rl=0):**
- `vfpclassbf16 k0 {k1}, xmm0, OFFSET sym` (VFPCLASSBF16Z128rik)
- `vfpclassbf16 k0 {k1}, ymm0, OFFSET sym` (VFPCLASSBF16Z256rik)

**CPU Features Required:** `+avx512f,+avx512dq,+avx512vl,+avx10.2,+avx10.2-512`

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to