[llvm-bugs] [Bug 30342] New: [ppc] LLVM generates an extra loop
via llvm-bugs
llvm-bugs at lists.llvm.org
Fri Sep 9 15:15:41 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=30342
Bug ID: 30342
Summary: [ppc] LLVM generates an extra loop
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Backend: PowerPC
Assignee: unassignedbugs at nondot.org
Reporter: carrot at google.com
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
Compile the following code with options
--target=powerpc64le-grtev4-linux-gnu -m64 -O2 -mvsx -mcpu=power8
typedef unsigned short T;
int foo(T* array_a, T* array_b, int size_a, int size_b, T* buf) {
int i_a = 0, i_b = 0, idx = 0;
while (i_a < size_a && i_b < size_b) {
if (array_a[i_a] == array_b[i_b]) {
buf[idx++] = array_a[i_a];
i_a++;
i_b++;
} else if (array_a[i_a] > array_b[i_b]) {
i_b++;
} else {
i_a++;
}
}
return idx;
}
Trunk llvm generates:
9 # BB#0: # %entry
10 li 12, 0
11 cmpwi 5, 0
12 std 28, -32(1) # 8-byte Folded Spill
13 std 29, -24(1) # 8-byte Folded Spill
14 std 30, -16(1) # 8-byte Folded Spill
15 cmpwi 1, 6, 0
16 crand 20, 1, 5
17 bc 4, 20, .LBB0_10
18 # BB#1: # %while.body.lr.ph.lr.ph.preheader
19 extsw 8, 6
20 extsw 9, 5
21 addi 4, 4, -2
22 li 11, 0
23 li 10, 0
24 li 30, 0
25 .LBB0_2: # %while.body.lr.ph.lr.ph
26 # =>This Loop Header: Depth=1
27 # Child Loop BB0_3 Depth 2
28 # Child Loop BB0_4 Depth 3
29 extsw 12, 30
30 .LBB0_3: # %while.body.lr.ph
31 # Parent Loop BB0_2 Depth=1
32 # => This Loop Header: Depth=2
33 # Child Loop BB0_4 Depth 3
34 extsw 11, 11
35 sldi 0, 12, 1
36 addi 30, 11, 1
37 lhzx 0, 3, 0
38 sldi 29, 11, 1
39 cmpd 30, 8
40 isel 30, 30, 8, 1
41 sub 28, 30, 11
42 add 30, 4, 29
43 mtctr 28
44 .p2align 5
45 .LBB0_4: # %while.body
46 # Parent Loop BB0_2 Depth=1
47 # Parent Loop BB0_3 Depth=2
48 # => This Inner Loop Header:
Depth=3
49 lhzu 29, 2(30)
50 cmplw 0, 29
51 beq 0, .LBB0_8
52 # BB#5: # %if.else
53 # in Loop: Header=BB0_4 Depth=3
54 ble 0, .LBB0_7
55 # BB#6: # %if.then21
56 # in Loop: Header=BB0_4 Depth=3
57 addi 11, 11, 1
58 bdnz .LBB0_4
59 b .LBB0_9
60 .p2align 4
61 .LBB0_7: # %if.else23
62 # in Loop: Header=BB0_3 Depth=2
63 addi 12, 12, 1
64 cmpw 1, 11, 6
65 cmpd 12, 9
66 crand 20, 0, 4
67 bc 12, 20, .LBB0_3
68 b .LBB0_9
69 .p2align 4
70 .LBB0_8: # %if.then
71 # in Loop: Header=BB0_2 Depth=1
72 addi 30, 12, 1
73 addi 11, 11, 1
74 addi 12, 10, 1
75 sldi 10, 10, 1
76 sthx 0, 7, 10
77 mr 10, 12
78 cmpw 30, 5
79 cmpw 1, 11, 6
80 crand 20, 0, 4
81 bc 12, 20, .LBB0_2
82 b .LBB0_10
83 .LBB0_9:
84 mr 12, 10
85 .LBB0_10: # %while.end
86 extsw 3, 12
87 ld 30, -16(1) # 8-byte Folded Reload
88 ld 29, -24(1) # 8-byte Folded Reload
89 ld 28, -32(1) # 8-byte Folded Reload
90 blr
Although there is only loop in the source code, llvm generates an extra loop
start from .LBB0_4. And the loop preparation work in .LBB0_3 is very slow
because of isel and mtctr.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160909/54839fd2/attachment.html>
More information about the llvm-bugs
mailing list