[LLVMbugs] [Bug 4679] New: Expect to see machine code sinking, not seeing it.
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Mon Aug 3 17:06:14 PDT 2009
http://llvm.org/bugs/show_bug.cgi?id=4679
Summary: Expect to see machine code sinking, not seeing it.
Product: libraries
Version: trunk
Platform: PC
OS/Version: MacOS X
Status: NEW
Severity: normal
Priority: P2
Component: Backend: X86
AssignedTo: unassignedbugs at nondot.org
ReportedBy: evan at fallingsnow.net
CC: llvmbugs at cs.uiuc.edu
Give the following IR and x86:
[[[ LLVM Optimized IR: bleh ]]]
define %"struct.rubinius::Object"* @0(%"struct.rubinius::VM"* %state,
%"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg,
%"struct.rubinius::Arguments"* %args) {
entry:
%cfstk94 = alloca [9 x %"struct.rubinius::Object"*], align 4
; <[9 x %"struct.rubinius::Object"*]*> [#uses=8]
%var_mem93 = alloca [5 x %"struct.rubinius::Object"*], align 4
; <[5 x %"struct.rubinius::Object"*]*> [#uses=6]
%cfstk94.sub = getelementptr [9 x %"struct.rubinius::Object"*]*
%cfstk94, i32 0, i32 0 ; <%"struct.rubinius::Object"**> [#uses=1]
%var_mem93.sub = getelementptr [5 x %"struct.rubinius::Object"*]*
%var_mem93, i32 0, i32 0 ; <%"struct.rubinius::Object"**>
[#uses=1]
%stack = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32
0, i32 8 ; <%"struct.rubinius::Object"**> [#uses=1]
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2
; <%"struct.rubinius::Executable"**> [#uses=1]
%msg.exec = load %"struct.rubinius::Executable"** %0 ;
<%"struct.rubinius::Executable"*> [#uses=1]
%1 = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32 0,
i32 3 ; <%"struct.rubinius::Object"**> [#uses=1]
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to
%"struct.rubinius::Object"* ; <%"struct.rubinius::Object"*> [#uses=1]
store %"struct.rubinius::Object"* %previous.c,
%"struct.rubinius::Object"** %cfstk94.sub
%2 = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32 0,
i32 2 ; <%"struct.rubinius::Object"**> [#uses=1]
%msg.c = bitcast %"struct.rubinius::Dispatch"* %msg to
%"struct.rubinius::Object"* ; <%"struct.rubinius::Object"*>
[#uses=1]
store %"struct.rubinius::Object"* %msg.c, %"struct.rubinius::Object"**
%2
%cm.c = getelementptr %"struct.rubinius::Executable"* %msg.exec, i32 0,
i32 0 ; <%"struct.rubinius::Object"*> [#uses=1]
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"**
%1
%3 = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32 0,
i32 4 ; <%"struct.rubinius::Object"**> [#uses=1]
store %"struct.rubinius::Object"* inttoptr (i32 16 to
%"struct.rubinius::Object"*), %"struct.rubinius::Object"** %3
%4 = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32 0,
i32 5 ; <%"struct.rubinius::Object"**> [#uses=1]
%5 = getelementptr [9 x %"struct.rubinius::Object"*]* %cfstk94, i32 0,
i32 7 ; <%"struct.rubinius::Object"**> [#uses=1]
%vars.c = bitcast [5 x %"struct.rubinius::Object"*]* %var_mem93 to
%"struct.rubinius::Object"* ; <%"struct.rubinius::Object"*> [#uses=1]
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"**
%5
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"**
%var_mem93.sub
%6 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0
; <%"struct.rubinius::Object"**> [#uses=1]
%args.recv = load %"struct.rubinius::Object"** %6 ;
<%"struct.rubinius::Object"*> [#uses=3]
%7 = getelementptr [5 x %"struct.rubinius::Object"*]* %var_mem93, i32
0, i32 2 ; <%"struct.rubinius::Object"**> [#uses=1]
store %"struct.rubinius::Object"* %args.recv,
%"struct.rubinius::Object"** %7
%8 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1
; <%"struct.rubinius::Module"**> [#uses=1]
%msg.module = load %"struct.rubinius::Module"** %8 ;
<%"struct.rubinius::Module"*> [#uses=1]
%9 = getelementptr [5 x %"struct.rubinius::Object"*]* %var_mem93, i32
0, i32 4 ; <%"struct.rubinius::Object"**> [#uses=1]
%msg.module.c = getelementptr %"struct.rubinius::Module"* %msg.module,
i32 0, i32 0 ; <%"struct.rubinius::Object"*> [#uses=1]
store %"struct.rubinius::Object"* %msg.module.c,
%"struct.rubinius::Object"** %9
%10 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1
; <%"struct.rubinius::Object"**> [#uses=1]
%args.block = load %"struct.rubinius::Object"** %10 ;
<%"struct.rubinius::Object"*> [#uses=1]
%11 = getelementptr [5 x %"struct.rubinius::Object"*]* %var_mem93, i32
0, i32 3 ; <%"struct.rubinius::Object"**> [#uses=1]
store %"struct.rubinius::Object"* %args.block,
%"struct.rubinius::Object"** %11
%12 = getelementptr [5 x %"struct.rubinius::Object"*]* %var_mem93, i32
0, i32 1 ; <%"struct.rubinius::Object"**> [#uses=1]
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"**
%12
store %"struct.rubinius::Object"* %args.recv,
%"struct.rubinius::Object"** %stack
store %"struct.rubinius::Object"* inttoptr (i32 2 to
%"struct.rubinius::Object"*), %"struct.rubinius::Object"** %4
%class_pos = getelementptr %"struct.rubinius::Object"* %args.recv, i32
0, i32 0, i32 1 ; <%"struct.rubinius::Class"**> [#uses=1]
%ref_class = load %"struct.rubinius::Class"** %class_pos
; <%"struct.rubinius::Class"*> [#uses=1]
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class,
i32 0, i32 3 ; <i32*> [#uses=1]
%class_id = load i32* %class_id_pos ; <i32> [#uses=1]
%check_class_id = icmp eq i32 %class_id, 1076 ; <i1>
[#uses=1]
br i1 %check_class_id, label %correct_class, label %use_send
correct_class: ; preds = %entry
ret %"struct.rubinius::Object"* inttoptr (i32 23 to
%"struct.rubinius::Object"*)
use_send: ; preds = %entry
%call_frame = bitcast [9 x %"struct.rubinius::Object"*]* %cfstk94 to
%"struct.rubinius::CallFrame"* ; <%"struct.rubinius::CallFrame"*>
[#uses=1]
%13 = call %"struct.rubinius::Object"*
@rbx_continue_uncommon(%"struct.rubinius::VM"* %state,
%"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"*
%args, i32 0) ; <%"struct.rubinius::Object"*> [#uses=1]
ret %"struct.rubinius::Object"* %13
}
[[[ JIT Machine Code ]]]
0x26b1010 sub $0x4c, %esp
0x26b1013 mov 0x58(%esp), %eax
0x26b1017 mov 0x8(%eax), %ecx
0x26b101a mov 0x54(%esp), %edx
0x26b101e mov %edx, 0x28(%esp)
0x26b1022 mov %eax, 0x30(%esp)
0x26b1026 mov %ecx, 0x34(%esp)
0x26b102a mov $0x10, 0x38(%esp)
0x26b1032 lea 0x14(%esp), %ecx
0x26b1036 mov %ecx, 0x44(%esp)
0x26b103a mov $0x0, 0x14(%esp)
0x26b1042 mov 0x5c(%esp), %ecx
0x26b1046 mov (%ecx), %edx
0x26b1048 mov %edx, 0x1c(%esp)
0x26b104c mov 0x4(%eax), %eax
0x26b104f mov %eax, 0x24(%esp)
0x26b1053 mov 0x4(%ecx), %eax
0x26b1056 mov %eax, 0x20(%esp)
0x26b105a mov $0x0, 0x18(%esp)
0x26b1062 mov %edx, 0x48(%esp)
0x26b1066 mov $0x2, 0x3c(%esp)
0x26b106e mov 0x4(%edx), %eax
0x26b1071 cmp $0x434, 0x24(%eax)
0x26b1078 jnz 0x77 ; 0x26b1087
0x26b107e mov $0x17, %eax
0x26b1083 add $0x4c, %esp
0x26b1086 ret
0x26b1087 mov 0x50(%esp), %eax
0x26b108b mov %ecx, 0x8(%esp)
0x26b108f lea 0x28(%esp), %ecx
0x26b1093 mov %ecx, 0x4(%esp)
0x26b1097 mov %eax, (%esp)
0x26b109a mov $0x0, 0xc(%esp)
0x26b10a2 call 0xfffffffffda6c5c0 ; 0x11d5d0 rbx_continue_uncommon
0x26b10a7 add $0x4c, %esp
0x26b10aa ret
The vast majority of those mov instructions before 0x26b106e could be sunk to
around 0x26b1087, as their values are unused in the terminating branch starting
on 0x26b107e.
Is there a construct in here that is preventing sinking? Is the sinker not
working correctly? Please advise.
--
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.
More information about the llvm-bugs
mailing list