Skip to content

Commit ecc78a2

Browse files
committed
[X86] Fix 32-bit immediate assertion and convert into backend error
The assertion previously did not work correctly because the operand was being truncated to an `int` prior to comparison.
1 parent 3f0ac46 commit ecc78a2

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -965,11 +965,11 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
965965
}
966966

967967
if (MI.getOperand(FIOperandNum+3).isImm()) {
968-
// Offset is a 32-bit integer.
969-
int Imm = (int)(MI.getOperand(FIOperandNum + 3).getImm());
970-
int Offset = FIOffset + Imm;
971-
assert((!Is64Bit || isInt<32>((long long)FIOffset + Imm)) &&
972-
"Requesting 64-bit offset in 32-bit immediate!");
968+
int64_t Imm = MI.getOperand(FIOperandNum + 3).getImm();
969+
int Offset = FIOffset + (int)Imm;
970+
if (!Is64Bit && !isInt<32>((int64_t)FIOffset + Imm))
971+
MI.emitGenericError("requesting 64-bit offset in 32-bit immediate: " +
972+
MF.getName());
973973
if (Offset != 0 || !tryOptimizeLEAtoMOV(II))
974974
MI.getOperand(FIOperandNum + 3).ChangeToImmediate(Offset);
975975
} else {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
; RUN: not llc < %s -mtriple=i686 2>&1 | FileCheck %s -check-prefix=i686
2+
; RUN: llc < %s -mtriple=x86_64 | FileCheck %s -check-prefix=x86_64
3+
4+
define dso_local i32 @main() #0 {
5+
; i686: error: <unknown>:0:0: requesting 64-bit offset in 32-bit immediate: main
6+
;
7+
; x86_64-LABEL: main:
8+
; x86_64: # %bb.0: # %entry
9+
; x86_64-NEXT: movl $4294967176, %eax # imm = 0xFFFFFF88
10+
; x86_64-NEXT: subq %rax, %rsp
11+
; x86_64-NEXT: .cfi_def_cfa_offset 4294967184
12+
; x86_64-NEXT: movb $32, -1073741994(%rsp)
13+
; x86_64-NEXT: movb $33, 2147483478(%rsp)
14+
; x86_64-NEXT: movb $34, 1073741654(%rsp)
15+
; x86_64-NEXT: movb $35, -170(%rsp)
16+
; x86_64-NEXT: xorl %eax, %eax
17+
; x86_64-NEXT: movl $4294967176, %ecx # imm = 0xFFFFFF88
18+
; x86_64-NEXT: addq %rcx, %rsp
19+
; x86_64-NEXT: .cfi_def_cfa_offset 8
20+
; x86_64-NEXT: retq
21+
entry:
22+
%a = alloca [1073741824 x i8], align 16
23+
%b = alloca [1073741824 x i8], align 16
24+
%c = alloca [1073741824 x i8], align 16
25+
%d = alloca [1073741824 x i8], align 16
26+
27+
%arrayida = getelementptr inbounds [1073741824 x i8], ptr %a, i64 0, i64 -42
28+
%arrayidb = getelementptr inbounds [1073741824 x i8], ptr %b, i64 0, i64 -42
29+
%arrayidc = getelementptr inbounds [1073741824 x i8], ptr %c, i64 0, i64 -42
30+
%arrayidd = getelementptr inbounds [1073741824 x i8], ptr %d, i64 0, i64 -42
31+
32+
store i8 32, ptr %arrayida, align 2
33+
store i8 33, ptr %arrayidb, align 2
34+
store i8 34, ptr %arrayidc, align 2
35+
store i8 35, ptr %arrayidd, align 2
36+
37+
ret i32 0
38+
}
39+
40+
attributes #0 = { optnone noinline }

0 commit comments

Comments
 (0)