Skip to content

Commit 6d67794

Browse files
committed
X86MCCodeEmitter: Work around gcc/value-range.cc bug in GCC 13.3.0
GCC 13.3.0 -O3 miscompiles the `getImmFixupKind` after commit c203791 (-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.
1 parent c5fff13 commit 6d67794

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,12 +2009,12 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
20092009
// (SSE4a extrq and insertq) have two trailing immediates.
20102010

20112011
// Skip two trainling conditional operands encoded in EVEX prefix
2012-
unsigned RemaningOps = NumOps - CurOp - 2 * HasTwoConditionalOps;
2013-
while (RemaningOps) {
2012+
unsigned RemainingOps = NumOps - CurOp - 2 * HasTwoConditionalOps;
2013+
while (RemainingOps) {
20142014
emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
2015-
getImmFixupKind(TSFlags), X86II::isImmPCRel(TSFlags),
2016-
StartByte, CB, Fixups);
2017-
--RemaningOps;
2015+
getImmFixupKind(Desc.TSFlags),
2016+
X86II::isImmPCRel(Desc.TSFlags), StartByte, CB, Fixups);
2017+
--RemainingOps;
20182018
}
20192019
CurOp += 2 * HasTwoConditionalOps;
20202020
}

0 commit comments

Comments
 (0)