blob: 9b32a8f55f34cd460b1ae881c007d9e8c9163e12 [file] [log] [blame]
Ehsan Amiria538b0f2016-08-03 18:17:35 +00001; RUN: llc -verify-machineinstrs -O0 -mcpu=ppc64 -mtriple=powerpc64-unknown-linux-gnu -fast-isel=false < %s | FileCheck %s
2; RUN: llc -verify-machineinstrs -O0 -mcpu=g4 -mtriple=powerpc-apple-darwin8 < %s | FileCheck -check-prefix=DARWIN32 %s
3; RUN: llc -verify-machineinstrs -O0 -mcpu=ppc970 -mtriple=powerpc64-apple-darwin8 < %s | FileCheck -check-prefix=DARWIN64 %s
Bill Schmidt6631e942013-02-20 17:31:41 +00004
5; Test case for PR 14779: anonymous aggregates are not handled correctly.
Bill Schmidt38b6cb52013-05-08 17:22:33 +00006; Darwin bug report PR 15821 is similar.
Bill Schmidt6631e942013-02-20 17:31:41 +00007; The bug is triggered by passing a byval structure after an anonymous
8; aggregate.
9
10%tarray = type { i64, i8* }
11
12define i8* @func1({ i64, i8* } %array, i8* %ptr) {
13entry:
14 %array_ptr = extractvalue {i64, i8* } %array, 1
15 %cond = icmp eq i8* %array_ptr, %ptr
16 br i1 %cond, label %equal, label %unequal
17equal:
18 ret i8* %array_ptr
19unequal:
20 ret i8* %ptr
21}
22
Stephen Lind24ab202013-07-14 06:24:09 +000023; CHECK-LABEL: func1:
Hal Finkel7c5cb062015-04-23 18:30:38 +000024; CHECK: cmpld {{([0-9]+,)?}}4, 5
Bill Schmidt4a28e822013-06-13 20:23:34 +000025; CHECK-DAG: std 4, -[[OFFSET1:[0-9]+]]
26; CHECK-DAG: std 5, -[[OFFSET2:[0-9]+]]
Bill Schmidt6631e942013-02-20 17:31:41 +000027; CHECK: ld 3, -[[OFFSET1]](1)
28; CHECK: ld 3, -[[OFFSET2]](1)
29
Bill Schmidt38b6cb52013-05-08 17:22:33 +000030; DARWIN32: _func1:
31; DARWIN32: mr
32; DARWIN32: mr r[[REG1:[0-9]+]], r[[REGA:[0-9]+]]
33; DARWIN32: mr r[[REG2:[0-9]+]], r[[REGB:[0-9]+]]
Hal Finkel7c5cb062015-04-23 18:30:38 +000034; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REGA]], r[[REGB]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +000035; DARWIN32: stw r[[REG1]], -[[OFFSET1:[0-9]+]]
36; DARWIN32: stw r[[REG2]], -[[OFFSET2:[0-9]+]]
37; DARWIN32: lwz r3, -[[OFFSET1]]
38; DARWIN32: lwz r3, -[[OFFSET2]]
39
40; DARWIN64: _func1:
41; DARWIN64: mr
42; DARWIN64: mr r[[REG1:[0-9]+]], r[[REGA:[0-9]+]]
43; DARWIN64: mr r[[REG2:[0-9]+]], r[[REGB:[0-9]+]]
Hal Finkel7c5cb062015-04-23 18:30:38 +000044; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REGA]], r[[REGB]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +000045; DARWIN64: std r[[REG1]], -[[OFFSET1:[0-9]+]]
46; DARWIN64: std r[[REG2]], -[[OFFSET2:[0-9]+]]
47; DARWIN64: ld r3, -[[OFFSET1]]
48; DARWIN64: ld r3, -[[OFFSET2]]
49
Bill Schmidt6631e942013-02-20 17:31:41 +000050
51define i8* @func2({ i64, i8* } %array1, %tarray* byval %array2) {
52entry:
53 %array1_ptr = extractvalue {i64, i8* } %array1, 1
David Blaikie79e6c742015-02-27 19:29:02 +000054 %tmp = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000055 %array2_ptr = load i8*, i8** %tmp
Bill Schmidt6631e942013-02-20 17:31:41 +000056 %cond = icmp eq i8* %array1_ptr, %array2_ptr
57 br i1 %cond, label %equal, label %unequal
58equal:
59 ret i8* %array1_ptr
60unequal:
61 ret i8* %array2_ptr
62}
Stephen Lind24ab202013-07-14 06:24:09 +000063; CHECK-LABEL: func2:
Nirav Dave54e22f32017-03-14 00:34:14 +000064; CHECK: cmpld {{([0-9]+,)?}}4, 6
65; CHECK-DAG: std 6, 72(1)
66; CHECK-DAG: std 5, 64(1)
67; CHECK-DAG: std 6, -[[OFFSET1:[0-9]+]]
Nirav Davea4133612016-11-28 14:30:29 +000068; CHECK-DAG: std 4, -[[OFFSET2:[0-9]+]]
Bill Schmidt6631e942013-02-20 17:31:41 +000069; CHECK: ld 3, -[[OFFSET2]](1)
70; CHECK: ld 3, -[[OFFSET1]](1)
71
Nirav Dave54e22f32017-03-14 00:34:14 +000072; DARWIN32-LABEL: _func2
73; DARWIN32-DAG: addi r[[REG8:[0-9]+]], r[[REGSP:[0-9]+]], 36
74; DARWIN32-DAG: lwz r[[REG2:[0-9]+]], 44(r[[REGSP]])
Bill Schmidt38b6cb52013-05-08 17:22:33 +000075; DARWIN32: mr
Nirav Dave54e22f32017-03-14 00:34:14 +000076; DARWIN32: mr r[[REG7:[0-9]+]], r5
77; DARWIN32-DAG: cmplw {{(cr[0-9]+,)?}}r5, r[[REG2]]
78; DARWIN32-DAG: stw r[[REG7]], -[[OFFSET1:[0-9]+]]
79; DARWIN32-DAG: stw r[[REG2]], -[[OFFSET2:[0-9]+]]
80; DARWIN32-DAG: lwz r3, -[[OFFSET1]]
81; DARWIN32-DAG: lwz r3, -[[OFFSET2]]
82
Bill Schmidt38b6cb52013-05-08 17:22:33 +000083
84; DARWIN64: _func2:
Ulrich Weigand55a96652014-07-20 22:26:40 +000085; DARWIN64: ld r[[REG2:[0-9]+]], 72(r1)
Bill Schmidt38b6cb52013-05-08 17:22:33 +000086; DARWIN64: mr
87; DARWIN64: mr r[[REG3:[0-9]+]], r[[REGA:[0-9]+]]
Hal Finkel7c5cb062015-04-23 18:30:38 +000088; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REGA]], r[[REG2]]
Chandler Carruthce52b802017-03-03 10:02:25 +000089; DARWIN64: std r[[REG2]], -[[OFFSET2:[0-9]+]]
Nirav Dave54e22f32017-03-14 00:34:14 +000090; DARWIN64: std r[[REG3]], -[[OFFSET1:[0-9]+]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +000091; DARWIN64: ld r3, -[[OFFSET1]]
92; DARWIN64: ld r3, -[[OFFSET2]]
93
94
Bill Schmidt6631e942013-02-20 17:31:41 +000095define i8* @func3({ i64, i8* }* byval %array1, %tarray* byval %array2) {
96entry:
David Blaikie79e6c742015-02-27 19:29:02 +000097 %tmp1 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %array1, i32 0, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000098 %array1_ptr = load i8*, i8** %tmp1
David Blaikie79e6c742015-02-27 19:29:02 +000099 %tmp2 = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000100 %array2_ptr = load i8*, i8** %tmp2
Bill Schmidt6631e942013-02-20 17:31:41 +0000101 %cond = icmp eq i8* %array1_ptr, %array2_ptr
102 br i1 %cond, label %equal, label %unequal
103equal:
104 ret i8* %array1_ptr
105unequal:
106 ret i8* %array2_ptr
107}
108
Stephen Lind24ab202013-07-14 06:24:09 +0000109; CHECK-LABEL: func3:
Nirav Dave54e22f32017-03-14 00:34:14 +0000110; CHECK: cmpld {{([0-9]+,)?}}4, 6
111; CHECK-DAG: std 4, -[[OFFSET2:[0-9]+]](1)
112; CHECK-DAG: std 6, -[[OFFSET1:[0-9]+]](1)
Bill Schmidt6631e942013-02-20 17:31:41 +0000113; CHECK: ld 3, -[[OFFSET2]](1)
114; CHECK: ld 3, -[[OFFSET1]](1)
115
Nirav Dave54e22f32017-03-14 00:34:14 +0000116; DARWIN32-LABEL: _func3:
117; DARWIN32-DAG: stw r[[REG8:[0-9]+]], 44(r[[REGSP:[0-9]+]])
118; DARWIN32-DAG: stw r[[REG5:[0-9]+]], 32(r[[REGSP]])
119; DARWIN32-DAG: addi r[[REG5a:[0-9]+]], r[[REGSP:[0-9]+]], 36
120; DARWIN32-DAG: addi r[[REG8a:[0-9]+]], r[[REGSP]], 24
121; DARWIN32-DAG: lwz r[[REG5a:[0-9]+]], 44(r[[REGSP]])
122; DARWIN32-DAG: lwz r[[REG8a:[0-9]+]], 32(r[[REGSP]])
123; DARWIN32-DAG: cmplw {{(cr[0-9]+,)?}}r[[REG8a]], r[[REG5a]]
124; DARWIN32-DAG: stw r[[REG5a]], -[[OFFSET1:[0-9]+]]
125; DARWIN32-DAG: stw r[[REG8a]], -[[OFFSET2:[0-9]+]]
126; DARWIN32-DAG: lwz r3, -[[OFFSET1:[0-9]+]]
127; DARWIN32-DAG: lwz r3, -[[OFFSET2:[0-9]+]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000128
129; DARWIN64: _func3:
Ulrich Weigand55a96652014-07-20 22:26:40 +0000130; DARWIN64: ld r[[REG3:[0-9]+]], 72(r1)
131; DARWIN64: ld r[[REG4:[0-9]+]], 56(r1)
Hal Finkel7c5cb062015-04-23 18:30:38 +0000132; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REG4]], r[[REG3]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000133; DARWIN64: std r[[REG3]], -[[OFFSET1:[0-9]+]]
134; DARWIN64: std r[[REG4]], -[[OFFSET2:[0-9]+]]
135; DARWIN64: ld r3, -[[OFFSET2]]
136; DARWIN64: ld r3, -[[OFFSET1]]
137
138
Bill Schmidt6631e942013-02-20 17:31:41 +0000139define i8* @func4(i64 %p1, i64 %p2, i64 %p3, i64 %p4,
140 i64 %p5, i64 %p6, i64 %p7, i64 %p8,
141 { i64, i8* } %array1, %tarray* byval %array2) {
142entry:
143 %array1_ptr = extractvalue {i64, i8* } %array1, 1
David Blaikie79e6c742015-02-27 19:29:02 +0000144 %tmp = getelementptr inbounds %tarray, %tarray* %array2, i32 0, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000145 %array2_ptr = load i8*, i8** %tmp
Bill Schmidt6631e942013-02-20 17:31:41 +0000146 %cond = icmp eq i8* %array1_ptr, %array2_ptr
147 br i1 %cond, label %equal, label %unequal
148equal:
149 ret i8* %array1_ptr
150unequal:
151 ret i8* %array2_ptr
152}
153
Stephen Lind24ab202013-07-14 06:24:09 +0000154; CHECK-LABEL: func4:
Ulrich Weigand55a96652014-07-20 22:26:40 +0000155; CHECK: ld [[REG3:[0-9]+]], 136(1)
Bill Schmidt6631e942013-02-20 17:31:41 +0000156; CHECK: ld [[REG2:[0-9]+]], 120(1)
Hal Finkel7c5cb062015-04-23 18:30:38 +0000157; CHECK: cmpld {{([0-9]+,)?}}[[REG2]], [[REG3]]
Bill Schmidt6631e942013-02-20 17:31:41 +0000158; CHECK: std [[REG3]], -[[OFFSET2:[0-9]+]](1)
Ulrich Weigand55a96652014-07-20 22:26:40 +0000159; CHECK: std [[REG2]], -[[OFFSET1:[0-9]+]](1)
Bill Schmidt6631e942013-02-20 17:31:41 +0000160; CHECK: ld 3, -[[OFFSET1]](1)
161; CHECK: ld 3, -[[OFFSET2]](1)
162
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000163; DARWIN32: _func4:
164; DARWIN32: lwz r[[REG4:[0-9]+]], 96(r1)
165; DARWIN32: addi r[[REG1:[0-9]+]], r1, 100
166; DARWIN32: lwz r[[REG3:[0-9]+]], 108(r1)
167; DARWIN32: mr r[[REG2:[0-9]+]], r[[REG4]]
Hal Finkel7c5cb062015-04-23 18:30:38 +0000168; DARWIN32: cmplw {{(cr[0-9]+,)?}}r[[REG4]], r[[REG3]]
Owen Andersondb420122015-03-19 22:48:57 +0000169; DARWIN32: stw r[[REG2]], -[[OFFSET1:[0-9]+]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000170; DARWIN32: stw r[[REG3]], -[[OFFSET2:[0-9]+]]
171; DARWIN32: lwz r[[REG1]], -[[OFFSET1]]
172; DARWIN32: lwz r[[REG1]], -[[OFFSET2]]
173
174; DARWIN64: _func4:
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000175; DARWIN64: ld r[[REG2:[0-9]+]], 120(r1)
Ulrich Weigand55a96652014-07-20 22:26:40 +0000176; DARWIN64: ld r[[REG3:[0-9]+]], 136(r1)
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000177; DARWIN64: mr r[[REG4:[0-9]+]], r[[REG2]]
Hal Finkel7c5cb062015-04-23 18:30:38 +0000178; DARWIN64: cmpld {{(cr[0-9]+,)?}}r[[REG2]], r[[REG3]]
Bill Schmidt38b6cb52013-05-08 17:22:33 +0000179; DARWIN64: std r[[REG4]], -[[OFFSET1:[0-9]+]]
180; DARWIN64: std r[[REG3]], -[[OFFSET2:[0-9]+]]
181; DARWIN64: ld r3, -[[OFFSET1]]
182; DARWIN64: ld r3, -[[OFFSET2]]