Skip to content

Commit 70324cd

Browse files
committed
[NFC][PhaseOrdering] Add new test for SROA misplacement
1 parent 34f3fa1 commit 70324cd

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -O3 -S | FileCheck %s
3+
; RUN: opt < %s -passes="default<O3>" -S | FileCheck %s
4+
5+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6+
target triple = "x86_64-pc-linux-gnu"
7+
8+
%t0 = type { ptr, ptr }
9+
%t1 = type { [16 x i32] }
10+
%t2 = type { %t3, ptr }
11+
%t3 = type { i8 }
12+
13+
define void @wibble(ptr %arg) personality ptr null {
14+
; CHECK-LABEL: @wibble(
15+
; CHECK-NEXT: bb:
16+
; CHECK-NEXT: [[I1:%.*]] = alloca [[T1:%.*]], align 16
17+
; CHECK-NEXT: [[I10_3_I_PRE:%.*]] = load i8, ptr [[ARG:%.*]], align 1
18+
; CHECK-NEXT: [[VECTOR_RECUR_INIT:%.*]] = insertelement <4 x i8> poison, i8 [[I10_3_I_PRE]], i64 3
19+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 1
20+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1
21+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i8> [[VECTOR_RECUR_INIT]], <4 x i8> [[WIDE_LOAD]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
22+
; CHECK-NEXT: [[TMP2:%.*]] = or <4 x i8> [[TMP1]], <i8 1, i8 1, i8 1, i8 1>
23+
; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[TMP2]] to <4 x i32>
24+
; CHECK-NEXT: store <4 x i32> [[TMP3]], ptr [[I1]], align 16
25+
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 4
26+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 5
27+
; CHECK-NEXT: [[WIDE_LOAD_1:%.*]] = load <4 x i8>, ptr [[TMP5]], align 1
28+
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD]], <4 x i8> [[WIDE_LOAD_1]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
29+
; CHECK-NEXT: [[TMP7:%.*]] = or <4 x i8> [[TMP6]], <i8 1, i8 1, i8 1, i8 1>
30+
; CHECK-NEXT: [[TMP8:%.*]] = zext <4 x i8> [[TMP7]] to <4 x i32>
31+
; CHECK-NEXT: store <4 x i32> [[TMP8]], ptr [[TMP4]], align 16
32+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 8
33+
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 9
34+
; CHECK-NEXT: [[WIDE_LOAD_2:%.*]] = load <4 x i8>, ptr [[TMP10]], align 1
35+
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD_1]], <4 x i8> [[WIDE_LOAD_2]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
36+
; CHECK-NEXT: [[TMP12:%.*]] = or <4 x i8> [[TMP11]], <i8 1, i8 1, i8 1, i8 1>
37+
; CHECK-NEXT: [[TMP13:%.*]] = zext <4 x i8> [[TMP12]] to <4 x i32>
38+
; CHECK-NEXT: store <4 x i32> [[TMP13]], ptr [[TMP9]], align 16
39+
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [16 x i32], ptr [[I1]], i64 0, i64 12
40+
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr [64 x i8], ptr [[ARG]], i64 0, i64 13
41+
; CHECK-NEXT: [[WIDE_LOAD_3:%.*]] = load <4 x i8>, ptr [[TMP15]], align 1
42+
; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD_2]], <4 x i8> [[WIDE_LOAD_3]], <4 x i32> <i32 3, i32 4, i32 5, i32 6>
43+
; CHECK-NEXT: [[TMP17:%.*]] = or <4 x i8> [[TMP16]], <i8 1, i8 1, i8 1, i8 1>
44+
; CHECK-NEXT: [[TMP18:%.*]] = zext <4 x i8> [[TMP17]] to <4 x i32>
45+
; CHECK-NEXT: store <4 x i32> [[TMP18]], ptr [[TMP14]], align 16
46+
; CHECK-NEXT: [[I3_I_I:%.*]] = load i32, ptr [[I1]], align 16
47+
; CHECK-NEXT: [[I4_I_I:%.*]] = add i32 [[I3_I_I]], 1
48+
; CHECK-NEXT: store i32 [[I4_I_I]], ptr [[ARG]], align 4
49+
; CHECK-NEXT: ret void
50+
;
51+
bb:
52+
%i = alloca [0 x [0 x [0 x [0 x [0 x [0 x %t0]]]]]], i32 0, align 8
53+
%i1 = alloca %t1, align 4
54+
store ptr %arg, ptr %i, align 8
55+
%i2 = getelementptr %t0, ptr %i, i64 0, i32 1
56+
store ptr %i1, ptr %i2, align 8
57+
br label %bb3
58+
59+
bb3: ; preds = %bb7, %bb
60+
%i4 = phi i32 [ 0, %bb ], [ %i8, %bb7 ]
61+
%i5 = icmp ult i32 %i4, 16
62+
br i1 %i5, label %bb7, label %bb6
63+
64+
bb6: ; preds = %bb3
65+
call void @baz(ptr %i, ptr %arg)
66+
ret void
67+
68+
bb7: ; preds = %bb3
69+
call void @foo(ptr %i, i32 %i4)
70+
%i8 = add i32 %i4, 1
71+
br label %bb3
72+
}
73+
74+
define linkonce_odr ptr @hoge(ptr %arg, i64 %arg1) {
75+
bb:
76+
%i = call ptr @ham(ptr %arg, i64 %arg1)
77+
ret ptr %i
78+
}
79+
80+
define linkonce_odr void @foo(ptr %arg, i32 %arg1) {
81+
bb:
82+
%i = load ptr, ptr %arg, align 8
83+
br label %bb2
84+
85+
bb2: ; preds = %bb6, %bb
86+
%i3 = phi i32 [ 3, %bb ], [ %i17, %bb6 ]
87+
%i4 = icmp sgt i32 %i3, -1
88+
br i1 %i4, label %bb6, label %bb5
89+
90+
bb5: ; preds = %bb2
91+
ret void
92+
93+
bb6: ; preds = %bb2
94+
%i7 = add i32 %i3, %arg1
95+
%i8 = sext i32 %i7 to i64
96+
%i9 = call ptr @hoge(ptr %i, i64 %i8)
97+
%i10 = load i8, ptr %i9, align 1
98+
%i11 = getelementptr %t0, ptr %arg, i64 0, i32 1
99+
%i12 = load ptr, ptr %i11, align 8
100+
%i13 = sext i32 %arg1 to i64
101+
%i14 = call ptr @foo.1(ptr %i12, i64 %i13)
102+
%i15 = or i8 %i10, 1
103+
%i16 = zext i8 %i15 to i32
104+
store i32 %i16, ptr %i14, align 4
105+
%i17 = add i32 %i3, -1
106+
br label %bb2
107+
}
108+
109+
define linkonce_odr void @baz(ptr %arg, ptr %arg1) {
110+
bb:
111+
call void @pluto(ptr %arg, ptr %arg1)
112+
ret void
113+
}
114+
115+
define linkonce_odr ptr @foo.1(ptr %arg, i64 %arg1) {
116+
bb:
117+
%i = call ptr @baz.2(ptr %arg, i64 %arg1)
118+
ret ptr %i
119+
}
120+
121+
define linkonce_odr ptr @baz.2(ptr %arg, i64 %arg1) {
122+
bb:
123+
%i = getelementptr [16 x i32], ptr %arg, i64 0, i64 %arg1
124+
ret ptr %i
125+
}
126+
127+
define linkonce_odr void @pluto(ptr %arg, ptr %arg1) {
128+
bb:
129+
%i = getelementptr %t2, ptr %arg, i64 0, i32 1
130+
%i2 = load ptr, ptr %i, align 8
131+
%i3 = load i32, ptr %i2, align 4
132+
%i4 = add i32 %i3, 1
133+
store i32 %i4, ptr %arg1, align 4
134+
ret void
135+
}
136+
137+
define linkonce_odr ptr @ham(ptr %arg, i64 %arg1) {
138+
bb:
139+
%i = getelementptr [64 x i8], ptr %arg, i64 0, i64 %arg1
140+
ret ptr %i
141+
}

0 commit comments

Comments
 (0)