http://llvm.org/bugs/show_bug.cgi?id=10322
Summary: -instcombine can deoptimize testcase?
Product: libraries
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: Scalar Optimizations
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected]
In
%struct.Value = type { i8* }
define void @f1(%struct.Value* %foo, %struct.Value* %bar) {
entry:
%arrayidx8 = getelementptr inbounds %struct.Value* %foo, i64 -2
call void @f2(%struct.Value* %arrayidx8) nounwind
call void @f2(%struct.Value* %bar) nounwind
call void @f2(%struct.Value* %arrayidx8) nounwind
call void @f2(%struct.Value* %bar) nounwind
br label %if.then18
if.then18:
%tmp2 = getelementptr inbounds %struct.Value* %arrayidx8, i64 0, i32 0
%tmp3 = load i8** %tmp2, align 8
call void @f3(i8* %tmp3) nounwind
ret void
}
declare void @f2(%struct.Value*)
declare void @f3(i8*)
instcombine can transform the second gep in
%tmp2 = getelementptr inbounds %struct.Value* %foo, i64 -2, i32 0
The original codegens to
movq %rsi, %r14
movq %rdi, %rbx
addq $-16, %rbx
movq %rbx, %rdi
callq _f2
movq %r14, %rdi
callq _f2
movq %rbx, %rdi
callq _f2
movq %r14, %rdi
callq _f2
movq (%rbx), %rdi
callq _f3
And the new one codegens to
movq %rsi, %r15
movq %rdi, %r14
leaq -16(%r14), %rbx
movq %rbx, %rdi
callq _f2
movq %r15, %rdi
callq _f2
movq %rbx, %rdi
callq _f2
movq %r15, %rdi
callq _f2
movq -16(%r14), %rdi
callq _f3
Note that we need an extra register. This can be fixed by adding a hasOneUse to
the optimization, but in this case that doesn't look like the right solution.
The right solution might be to do this "gep propagation" at the machine code
level too and produce
movq %rsi, %r15
movq %rdi, %r14
leaq -16(%r14), %rdi
callq _f2
movq %r15, %rdi
callq _f2
leaq -16(%r14), %rdi
callq _f2
movq %r15, %rdi
callq _f2
movq -16(%r14), %rdi
callq _f3
Yet another option is to disable the optimization if all the new indices are 0,
since in that case the two values are the "same", they just have a different
type.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- 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