https://llvm.org/bugs/show_bug.cgi?id=23289
Bug ID: 23289
Summary: Trivial values not rematerialized
Product: libraries
Version: trunk
Hardware: PC
OS: Windows NT
Status: NEW
Severity: normal
Priority: P
Component: Register Allocator
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Classification: Unclassified
The following code produces really suboptimal code seemingly on all targets.
#define N 16
extern void g(int);
int f(int *p, int n) {
for (int i = 0; i < n; ++i) {
for (int k = 0; k < n; ++k) {
#pragma clang loop unroll(full)
for (int j = 0; j < N; ++j)
g((j+i)*k);
}
}
}
It produces a bunch of spills: (main loop block):
.LBB0_2: @ %.preheader.lr.ph.us
[31/1853]
@ =>This Loop Header: Depth=1
@ Child Loop BB0_3 Depth 2
mov r5, r4
mov r9, #0
add r0, r5, #11
add r6, r5, #4
add r7, r5, #3
add r8, r5, #2
add r4, r5, #1
str r0, [sp, #24] @ 4-byte Spill
add r0, r5, #10
str r0, [sp, #20] @ 4-byte Spill
add r0, r5, #9
str r0, [sp, #16] @ 4-byte Spill
add r0, r5, #8
str r0, [sp, #12] @ 4-byte Spill
add r0, r5, #7
str r0, [sp, #8] @ 4-byte Spill
add r0, r5, #6
str r0, [sp, #4] @ 4-byte Spill
add r0, r5, #5
str r0, [sp] @ 4-byte Spill
.LBB0_3: @ %.preheader.us
@ Parent Loop BB0_2 Depth=1
@ => This Inner Loop Header: Depth=2
mul r0, r5, r9
bl g
mul r0, r4, r9
bl g
mul r0, r8, r9
bl g
mul r0, r7, r9
bl g
mul r0, r6, r9
bl g
ldr r0, [sp] @ 4-byte Reload
mul r0, r0, r9
bl g
ldr r0, [sp, #4] @ 4-byte Reload
mul r0, r0, r9
bl g
ldr r0, [sp, #8] @ 4-byte Reload
... snip, more like this ...
X86 also shows massive spilling. The instructions outside the loop are
trivially rematerializable, but for some reason seem not to be considered.
Because this affects all targets, I suspect this is a bug in the core RA/Spill
placement algorithm.
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs