Skip to content

Commit d34951e

Browse files
committed
[X86][APX] Fix the assertion of NF instruction with relocation
The assertion should be raised only for the NF instructions with GOTTPOFF relocation.
1 parent 2e713af commit d34951e

File tree

2 files changed

+104
-2
lines changed

2 files changed

+104
-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: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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) {
8+
; CHECK-LABEL: foo:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: pushq %rbp
11+
; CHECK-NEXT: .cfi_def_cfa_offset 16
12+
; CHECK-NEXT: pushq %r15
13+
; CHECK-NEXT: .cfi_def_cfa_offset 24
14+
; CHECK-NEXT: pushq %r14
15+
; CHECK-NEXT: .cfi_def_cfa_offset 32
16+
; CHECK-NEXT: pushq %r13
17+
; CHECK-NEXT: .cfi_def_cfa_offset 40
18+
; CHECK-NEXT: pushq %r12
19+
; CHECK-NEXT: .cfi_def_cfa_offset 48
20+
; CHECK-NEXT: pushq %rbx
21+
; CHECK-NEXT: .cfi_def_cfa_offset 56
22+
; CHECK-NEXT: pushq %rax
23+
; CHECK-NEXT: .cfi_def_cfa_offset 64
24+
; CHECK-NEXT: .cfi_offset %rbx, -56
25+
; CHECK-NEXT: .cfi_offset %r12, -48
26+
; CHECK-NEXT: .cfi_offset %r13, -40
27+
; CHECK-NEXT: .cfi_offset %r14, -32
28+
; CHECK-NEXT: .cfi_offset %r15, -24
29+
; CHECK-NEXT: .cfi_offset %rbp, -16
30+
; CHECK-NEXT: movl %esi, %ebx
31+
; CHECK-NEXT: movslq %edi, %r15
32+
; CHECK-NEXT: leaq (,%r15,4), %rax
33+
; CHECK-NEXT: leaq (%rax,%rax,4), %r14
34+
; CHECK-NEXT: movl %r15d, %r12d
35+
; CHECK-NEXT: xorl %r13d, %r13d
36+
; CHECK-NEXT: xorl %ebp, %ebp
37+
; CHECK-NEXT: jmp .LBB0_1
38+
; CHECK-NEXT: .p2align 4
39+
; CHECK-NEXT: .LBB0_3: # %if.end41
40+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
41+
; CHECK-NEXT: leaq (%r12,%rbp), %rdi
42+
; CHECK-NEXT: # kill: def $edi killed $edi killed $rdi
43+
; CHECK-NEXT: xorl %esi, %esi
44+
; CHECK-NEXT: movq %r14, %rdx
45+
; CHECK-NEXT: callq *%r13
46+
; CHECK-NEXT: incq %rbp
47+
; CHECK-NEXT: addq $20, %r14
48+
; CHECK-NEXT: .LBB0_1: # %for.body30
49+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
50+
; CHECK-NEXT: testb $1, %bl
51+
; CHECK-NEXT: je .LBB0_3
52+
; CHECK-NEXT: # %bb.2: # %if.then37
53+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
54+
; CHECK-NEXT: movq %r15, %rax
55+
; CHECK-NEXT: addq %rbp, %rax
56+
; CHECK-NEXT: movq 0, %rax
57+
; CHECK-NEXT: {nf} addq %r15, %rax
58+
; CHECK-NEXT: movb $0, (%rbp,%rax)
59+
; CHECK-NEXT: jmp .LBB0_3
60+
entry:
61+
%1 = sext i32 %0 to i64
62+
br label %for.body30
63+
64+
for.body30: ; preds = %if.end41, %entry
65+
%indvars.iv = phi i64 [ %1, %entry ], [ %indvars.iv.next, %if.end41 ]
66+
%.pre88 = trunc i64 %indvars.iv to i32
67+
br label %if.end16.i
68+
69+
if.then9.i: ; No predecessors!
70+
call fastcc void null(ptr null, i32 %.pre88)
71+
br label %if.end16.i
72+
73+
if.end16.i: ; preds = %if.then9.i, %for.body30
74+
br i1 %or.cond, label %if.then37, label %if.end41
75+
76+
if.then37: ; preds = %if.end16.i
77+
%2 = load ptr, ptr null, align 8
78+
%arrayidx.i = getelementptr i8, ptr %2, i64 %indvars.iv
79+
store i8 0, ptr %arrayidx.i, align 1
80+
%3 = icmp eq i64 %indvars.iv, 0
81+
br i1 %3, label %if.end41, label %if.then.i65
82+
83+
if.then.i65: ; preds = %if.then37
84+
%arraydecay.i = getelementptr [5 x float], ptr null, i64 %indvars.iv, i64 -5
85+
%4 = call <5 x float> @llvm.masked.load.v5f32.p0(ptr %arraydecay.i, i32 1, <5 x i1> zeroinitializer, <5 x float> zeroinitializer)
86+
br label %if.end41
87+
88+
if.end41: ; preds = %if.then.i65, %if.then37, %if.end16.i
89+
%arraydecay44 = getelementptr [5 x float], ptr null, i64 %indvars.iv, i64 0
90+
call fastcc void null(i32 %.pre88, i32 0, ptr %arraydecay44)
91+
%indvars.iv.next = add i64 %indvars.iv, 1
92+
%cmp29 = icmp slt i64 %indvars.iv, 0
93+
br label %for.body30
94+
}
95+
96+
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)