Skip to content

Commit 3752b7d

Browse files
fzou1IanWood1
authored andcommitted
[X86][APX] Fix the assertion of NF instruction with relocation (llvm#138500)
The assertion should be raised only for the NF instructions with GOTTPOFF relocation.
1 parent 68e7dd6 commit 3752b7d

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

llvm/lib/Target/X86/X86SuppressAPXForReloc.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,14 @@ static bool handleNDDOrNFInstructions(MachineFunction &MF,
155155
switch (Opcode) {
156156
case X86::ADD64rm_NF:
157157
case X86::ADD64mr_NF_ND:
158-
case X86::ADD64rm_NF_ND:
159-
llvm_unreachable("Unexpected NF instruction!");
158+
case X86::ADD64rm_NF_ND: {
159+
int MemOpNo = X86II::getMemoryOperandNo(MI.getDesc().TSFlags) +
160+
X86II::getOperandBias(MI.getDesc());
161+
const MachineOperand &MO = MI.getOperand(X86::AddrDisp + MemOpNo);
162+
if (MO.getTargetFlags() == X86II::MO_GOTTPOFF)
163+
llvm_unreachable("Unexpected NF instruction!");
164+
break;
165+
}
160166
case X86::ADD64rm_ND: {
161167
int MemOpNo = X86II::getMemoryOperandNo(MI.getDesc().TSFlags) +
162168
X86II::getOperandBias(MI.getDesc());
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=x86_64 -mattr=+nf -verify-machineinstrs | FileCheck %s
3+
4+
; This is to check no assertion raised in X86 Suppress APX for Relocation pass
5+
; if there is a NF instruction
6+
7+
define fastcc void @foo(i32 %0, i1 %or.cond) nounwind {
8+
; CHECK-LABEL: foo:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: pushq %rbp
11+
; CHECK-NEXT: pushq %r15
12+
; CHECK-NEXT: pushq %r14
13+
; CHECK-NEXT: pushq %r13
14+
; CHECK-NEXT: pushq %r12
15+
; CHECK-NEXT: pushq %rbx
16+
; CHECK-NEXT: pushq %rax
17+
; CHECK-NEXT: movl %esi, %ebx
18+
; CHECK-NEXT: movslq %edi, %r15
19+
; CHECK-NEXT: leaq (,%r15,4), %rax
20+
; CHECK-NEXT: leaq (%rax,%rax,4), %r14
21+
; CHECK-NEXT: movl %r15d, %r12d
22+
; CHECK-NEXT: xorl %r13d, %r13d
23+
; CHECK-NEXT: xorl %ebp, %ebp
24+
; CHECK-NEXT: jmp .LBB0_1
25+
; CHECK-NEXT: .p2align 4
26+
; CHECK-NEXT: .LBB0_3: # %if.end41
27+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
28+
; CHECK-NEXT: leaq (%r12,%rbp), %rdi
29+
; CHECK-NEXT: # kill: def $edi killed $edi killed $rdi
30+
; CHECK-NEXT: xorl %esi, %esi
31+
; CHECK-NEXT: movq %r14, %rdx
32+
; CHECK-NEXT: callq *%r13
33+
; CHECK-NEXT: incq %rbp
34+
; CHECK-NEXT: addq $20, %r14
35+
; CHECK-NEXT: .LBB0_1: # %for.body30
36+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
37+
; CHECK-NEXT: testb $1, %bl
38+
; CHECK-NEXT: je .LBB0_3
39+
; CHECK-NEXT: # %bb.2: # %if.then37
40+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
41+
; CHECK-NEXT: movq %r15, %rax
42+
; CHECK-NEXT: addq %rbp, %rax
43+
; CHECK-NEXT: movq 0, %rax
44+
; CHECK-NEXT: {nf} addq %r15, %rax
45+
; CHECK-NEXT: movb $0, (%rbp,%rax)
46+
; CHECK-NEXT: jmp .LBB0_3
47+
entry:
48+
%1 = sext i32 %0 to i64
49+
br label %for.body30
50+
51+
for.body30: ; preds = %if.end41, %entry
52+
%indvars.iv = phi i64 [ %1, %entry ], [ %indvars.iv.next, %if.end41 ]
53+
%.pre88 = trunc i64 %indvars.iv to i32
54+
br label %if.end16.i
55+
56+
if.then9.i: ; No predecessors!
57+
call fastcc void null(ptr null, i32 %.pre88)
58+
br label %if.end16.i
59+
60+
if.end16.i: ; preds = %if.then9.i, %for.body30
61+
br i1 %or.cond, label %if.then37, label %if.end41
62+
63+
if.then37: ; preds = %if.end16.i
64+
%2 = load ptr, ptr null, align 8
65+
%arrayidx.i = getelementptr i8, ptr %2, i64 %indvars.iv
66+
store i8 0, ptr %arrayidx.i, align 1
67+
%3 = icmp eq i64 %indvars.iv, 0
68+
br i1 %3, label %if.end41, label %if.then.i65
69+
70+
if.then.i65: ; preds = %if.then37
71+
%arraydecay.i = getelementptr [5 x float], ptr null, i64 %indvars.iv, i64 -5
72+
%4 = call <5 x float> @llvm.masked.load.v5f32.p0(ptr %arraydecay.i, i32 1, <5 x i1> zeroinitializer, <5 x float> zeroinitializer)
73+
br label %if.end41
74+
75+
if.end41: ; preds = %if.then.i65, %if.then37, %if.end16.i
76+
%arraydecay44 = getelementptr [5 x float], ptr null, i64 %indvars.iv, i64 0
77+
call fastcc void null(i32 %.pre88, i32 0, ptr %arraydecay44)
78+
%indvars.iv.next = add i64 %indvars.iv, 1
79+
%cmp29 = icmp slt i64 %indvars.iv, 0
80+
br label %for.body30
81+
}
82+
83+
declare <5 x float> @llvm.masked.load.v5f32.p0(ptr captures(none), i32 immarg, <5 x i1>, <5 x float>)

0 commit comments

Comments
 (0)