Skip to content

Commit 3c3e71d

Browse files
committed
X86: Add regression test from issue #76416
Also add another testcase reported at the same regression commit. Make sure this assert is fixed when the patch is eventually reapplied.
1 parent e6b14b6 commit 3c3e71d

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
3+
4+
; Not from issue 76416, but separate testcase reported on the same
5+
; regressing commit.
6+
define void @other_regression(i1 %cmp.not.i.i.i) {
7+
; CHECK-LABEL: other_regression:
8+
; CHECK: # %bb.0: # %entry
9+
; CHECK-NEXT: pushq %rax
10+
; CHECK-NEXT: .cfi_def_cfa_offset 16
11+
; CHECK-NEXT: movl 0, %eax
12+
; CHECK-NEXT: xorl %ecx, %ecx
13+
; CHECK-NEXT: sarl %cl, %eax
14+
; CHECK-NEXT: movl $1, %edx
15+
; CHECK-NEXT: xorl %ecx, %ecx
16+
; CHECK-NEXT: shrl %cl, %edx
17+
; CHECK-NEXT: imull %eax, %edx
18+
; CHECK-NEXT: movslq %edx, %rsi
19+
; CHECK-NEXT: xorl %eax, %eax
20+
; CHECK-NEXT: xorl %edi, %edi
21+
; CHECK-NEXT: xorl %edx, %edx
22+
; CHECK-NEXT: callq *%rax
23+
entry:
24+
br label %for.cond10.preheader
25+
26+
trap: ; preds = %for.body13
27+
unreachable
28+
29+
for.cond10.preheader: ; preds = %while.cond.i.i.i, %entry
30+
%indvars.iv = phi i64 [ 0, %entry ], [ 1, %while.cond.i.i.i ]
31+
%i = trunc i64 %indvars.iv to i32
32+
br label %for.body13
33+
34+
for.body13: ; preds = %for.cond10.preheader
35+
%i1 = load i32, ptr null, align 4
36+
%shr = ashr i32 %i1, %i
37+
%shr15 = ashr i32 1, %i
38+
%mul16 = mul i32 %shr15, %shr
39+
%conv = sext i32 %mul16 to i64
40+
call void null(ptr null, i64 %conv, ptr null)
41+
br i1 false, label %while.cond.i.i.i, label %trap
42+
43+
while.cond.i.i.i: ; preds = %while.cond.i.i.i, %for.body13
44+
br i1 %cmp.not.i.i.i, label %for.cond10.preheader, label %while.cond.i.i.i
45+
}

llvm/test/CodeGen/X86/issue76416.ll

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=x86_64-unknown-freebsd15.0 < %s | FileCheck %s
3+
4+
%struct.anon.5.28.78.99.149.119 = type { [4 x i8] }
5+
6+
@vga_load_state_p = external dso_local global ptr, align 8
7+
@vga_load_state_data = external dso_local global i8, align 1
8+
9+
define dso_local void @vga_load_state() #0 {
10+
; CHECK-LABEL: vga_load_state:
11+
; CHECK: # %bb.0: # %entry
12+
; CHECK-NEXT: movl $0, -{{[0-9]+}}(%rsp)
13+
; CHECK-NEXT: cmpl $3, -{{[0-9]+}}(%rsp)
14+
; CHECK-NEXT: jg .LBB0_3
15+
; CHECK-NEXT: .p2align 4, 0x90
16+
; CHECK-NEXT: .LBB0_2: # %for.body
17+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
18+
; CHECK-NEXT: xorl %eax, %eax
19+
; CHECK-NEXT: #APP
20+
; CHECK-NEXT: #NO_APP
21+
; CHECK-NEXT: incl -{{[0-9]+}}(%rsp)
22+
; CHECK-NEXT: cmpl $3, -{{[0-9]+}}(%rsp)
23+
; CHECK-NEXT: jle .LBB0_2
24+
; CHECK-NEXT: .LBB0_3: # %for.end
25+
; CHECK-NEXT: movl $0, -{{[0-9]+}}(%rsp)
26+
; CHECK-NEXT: .p2align 4, 0x90
27+
; CHECK-NEXT: .LBB0_4: # %for.cond1
28+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
29+
; CHECK-NEXT: #APP
30+
; CHECK-NEXT: #NO_APP
31+
; CHECK-NEXT: movq vga_load_state_p(%rip), %rax
32+
; CHECK-NEXT: movslq -{{[0-9]+}}(%rsp), %rcx
33+
; CHECK-NEXT: movzbl (%rax,%rcx), %eax
34+
; CHECK-NEXT: movb %al, vga_load_state_data(%rip)
35+
; CHECK-NEXT: leal 1(%rcx), %eax
36+
; CHECK-NEXT: movl %eax, -{{[0-9]+}}(%rsp)
37+
; CHECK-NEXT: jmp .LBB0_4
38+
entry:
39+
%i = alloca i32, align 4
40+
store i32 0, ptr %i, align 4
41+
br label %for.cond
42+
43+
for.cond: ; preds = %for.body, %entry
44+
%i1 = load i32, ptr %i, align 4
45+
%cmp = icmp slt i32 %i1, 4
46+
br i1 %cmp, label %for.body, label %for.end
47+
48+
for.body: ; preds = %for.cond
49+
call void asm sideeffect "", "{ax},~{dirflag},~{fpsr},~{flags}"(i8 0) #1
50+
%i2 = load i32, ptr %i, align 4
51+
%inc = add nsw i32 %i2, 1
52+
store i32 %inc, ptr %i, align 4
53+
br label %for.cond
54+
55+
for.end: ; preds = %for.cond
56+
store i32 0, ptr %i, align 4
57+
br label %for.cond1
58+
59+
for.cond1: ; preds = %for.cond1, %for.end
60+
call void asm sideeffect "", "N{dx},~{dirflag},~{fpsr},~{flags}"(i32 poison) #1
61+
%i3 = load ptr, ptr @vga_load_state_p, align 8
62+
%regs = getelementptr inbounds %struct.anon.5.28.78.99.149.119, ptr %i3, i32 0, i32 0
63+
%i4 = load i32, ptr %i, align 4
64+
%idxprom = sext i32 %i4 to i64
65+
%arrayidx = getelementptr inbounds [4 x i8], ptr %regs, i64 0, i64 %idxprom
66+
%i5 = load i8, ptr %arrayidx, align 1
67+
store i8 %i5, ptr @vga_load_state_data, align 1
68+
%i6 = load i32, ptr %i, align 4
69+
%inc5 = add nsw i32 %i6, 1
70+
store i32 %inc5, ptr %i, align 4
71+
br label %for.cond1, !llvm.loop !0
72+
}
73+
74+
attributes #0 = { "tune-cpu"="generic" }
75+
attributes #1 = { nounwind }
76+
77+
!0 = distinct !{!0, !1}
78+
!1 = !{!"llvm.loop.mustprogress"}

0 commit comments

Comments
 (0)