[llvm] 6d67794 - X86MCCodeEmitter: Work around gcc/value-range.cc bug in GCC 13.3.0

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 6 12:37:54 PDT 2025


Author: Fangrui Song
Date: 2025-07-06T12:37:50-07:00
New Revision: 6d67794d164ebeedbd287816e1541964fb5d6c99

URL: https://github.com/llvm/llvm-project/commit/6d67794d164ebeedbd287816e1541964fb5d6c99
DIFF: https://github.com/llvm/llvm-project/commit/6d67794d164ebeedbd287816e1541964fb5d6c99.diff

LOG: X86MCCodeEmitter: Work around gcc/value-range.cc bug in GCC 13.3.0

GCC 13.3.0 -O3 miscompiles the `getImmFixupKind` after commit
c20379198c7fb66b9514d21ae1e07b0705e3e6fa (-O2 is good), leading to spurious
unreachable failure.

```
% ninja -C /tmp/out/custom-gcc-13 llc && /tmp/out/custom-gcc-13/bin/llc llvm/test/CodeGen/X86/2008-08-06-RewriterBug.ll -mtriple=i686
ninja: Entering directory `/tmp/out/custom-gcc-13'
ninja: no work to do.
Unknown immediate size
UNREACHABLE executed at /home/ray/llvm/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h:904!
```

The latest releases/gcc-13 branch contains the fix
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109934#c6 , resolving this
miscompile.

`Desc.TSFlags` works around the bug.

Added: 
    

Modified: 
    llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
index 5db00a7f17bc2..8412de32fcb96 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
@@ -2009,12 +2009,12 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
     // (SSE4a extrq and insertq) have two trailing immediates.
 
     // Skip two trainling conditional operands encoded in EVEX prefix
-    unsigned RemaningOps = NumOps - CurOp - 2 * HasTwoConditionalOps;
-    while (RemaningOps) {
+    unsigned RemainingOps = NumOps - CurOp - 2 * HasTwoConditionalOps;
+    while (RemainingOps) {
       emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
-                    getImmFixupKind(TSFlags), X86II::isImmPCRel(TSFlags),
-                    StartByte, CB, Fixups);
-      --RemaningOps;
+                    getImmFixupKind(Desc.TSFlags),
+                    X86II::isImmPCRel(Desc.TSFlags), StartByte, CB, Fixups);
+      --RemainingOps;
     }
     CurOp += 2 * HasTwoConditionalOps;
   }


        


More information about the llvm-commits mailing list