Skip to content

Commit 31ffdb5

Browse files
committed
[ArgPromotion] Add test case for #84807.
Test case for #84807, showing a mis-compile in ArgPromotion.
1 parent 65fd664 commit 31ffdb5

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -p argpromotion -S %s | FileCheck %s
3+
4+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5+
6+
@f = dso_local global { i16, i64 } { i16 1, i64 0 }, align 8
7+
8+
; Test case for https://github.com/llvm/llvm-project/issues/84807.
9+
10+
; FIXME: Currently the loads from @callee are moved to @caller, even though
11+
; the store in %then may aliases to load from %q.
12+
13+
define i32 @caller1(i1 %c) {
14+
; CHECK-LABEL: define i32 @caller1(
15+
; CHECK-SAME: i1 [[C:%.*]]) {
16+
; CHECK-NEXT: entry:
17+
; CHECK-NEXT: [[F_VAL:%.*]] = load i16, ptr @f, align 8
18+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @f, i64 8
19+
; CHECK-NEXT: [[F_VAL1:%.*]] = load i64, ptr [[TMP0]], align 8
20+
; CHECK-NEXT: call void @callee1(i16 [[F_VAL]], i64 [[F_VAL1]], i1 [[C]])
21+
; CHECK-NEXT: ret i32 0
22+
;
23+
entry:
24+
call void @callee1(ptr noundef nonnull @f, i1 %c)
25+
ret i32 0
26+
}
27+
28+
define internal void @callee1(ptr nocapture noundef readonly %q, i1 %c) {
29+
; CHECK-LABEL: define internal void @callee1(
30+
; CHECK-SAME: i16 [[Q_0_VAL:%.*]], i64 [[Q_8_VAL:%.*]], i1 [[C:%.*]]) {
31+
; CHECK-NEXT: entry:
32+
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[EXIT:%.*]]
33+
; CHECK: then:
34+
; CHECK-NEXT: store i16 123, ptr @f, align 8
35+
; CHECK-NEXT: br label [[EXIT]]
36+
; CHECK: exit:
37+
; CHECK-NEXT: call void @use(i16 [[Q_0_VAL]], i64 [[Q_8_VAL]])
38+
; CHECK-NEXT: ret void
39+
;
40+
entry:
41+
br i1 %c, label %then, label %exit
42+
43+
then:
44+
store i16 123, ptr @f, align 8
45+
br label %exit
46+
47+
exit:
48+
%l.0 = load i16, ptr %q, align 8
49+
%gep.8 = getelementptr inbounds i8, ptr %q, i64 8
50+
%l.1 = load i64, ptr %gep.8, align 8
51+
call void @use(i16 %l.0, i64 %l.1)
52+
ret void
53+
54+
uselistorder ptr %q, { 1, 0 }
55+
}
56+
57+
; Same as @caller1/callee2, but with default uselist order.
58+
define i32 @caller2(i1 %c) {
59+
; CHECK-LABEL: define i32 @caller2(
60+
; CHECK-SAME: i1 [[C:%.*]]) {
61+
; CHECK-NEXT: entry:
62+
; CHECK-NEXT: call void @callee2(ptr noundef nonnull @f, i1 [[C]])
63+
; CHECK-NEXT: ret i32 0
64+
;
65+
entry:
66+
call void @callee2(ptr noundef nonnull @f, i1 %c)
67+
ret i32 0
68+
}
69+
70+
define internal void @callee2(ptr nocapture noundef readonly %q, i1 %c) {
71+
; CHECK-LABEL: define internal void @callee2(
72+
; CHECK-SAME: ptr nocapture noundef readonly [[Q:%.*]], i1 [[C:%.*]]) {
73+
; CHECK-NEXT: entry:
74+
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[EXIT:%.*]]
75+
; CHECK: then:
76+
; CHECK-NEXT: store i16 123, ptr @f, align 8
77+
; CHECK-NEXT: br label [[EXIT]]
78+
; CHECK: exit:
79+
; CHECK-NEXT: [[Q_0_VAL:%.*]] = load i16, ptr [[Q]], align 8
80+
; CHECK-NEXT: [[GEP_8:%.*]] = getelementptr inbounds i8, ptr [[Q]], i64 8
81+
; CHECK-NEXT: [[Q_8_VAL:%.*]] = load i64, ptr [[GEP_8]], align 8
82+
; CHECK-NEXT: call void @use(i16 [[Q_0_VAL]], i64 [[Q_8_VAL]])
83+
; CHECK-NEXT: ret void
84+
;
85+
entry:
86+
br i1 %c, label %then, label %exit
87+
88+
then:
89+
store i16 123, ptr @f, align 8
90+
br label %exit
91+
92+
exit:
93+
%l.0 = load i16, ptr %q, align 8
94+
%gep.8 = getelementptr inbounds i8, ptr %q, i64 8
95+
%l.1 = load i64, ptr %gep.8, align 8
96+
call void @use(i16 %l.0, i64 %l.1)
97+
ret void
98+
}
99+
100+
declare void @use(i16, i64)

0 commit comments

Comments
 (0)