mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-25 21:46:50 +00:00
move PR9408 here.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131841 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bec6a19289
commit
b6fcf4cfbc
@ -2305,4 +2305,44 @@ The two or/and's should be merged into one each.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
Machine level code hoisting can be useful in some cases. For example, PR9408
|
||||
is about:
|
||||
|
||||
typedef union {
|
||||
void (*f1)(int);
|
||||
void (*f2)(long);
|
||||
} funcs;
|
||||
|
||||
void foo(funcs f, int which) {
|
||||
int a = 5;
|
||||
if (which) {
|
||||
f.f1(a);
|
||||
} else {
|
||||
f.f2(a);
|
||||
}
|
||||
}
|
||||
|
||||
which we compile to:
|
||||
|
||||
foo: # @foo
|
||||
# BB#0: # %entry
|
||||
pushq %rbp
|
||||
movq %rsp, %rbp
|
||||
testl %esi, %esi
|
||||
movq %rdi, %rax
|
||||
je .LBB0_2
|
||||
# BB#1: # %if.then
|
||||
movl $5, %edi
|
||||
callq *%rax
|
||||
popq %rbp
|
||||
ret
|
||||
.LBB0_2: # %if.else
|
||||
movl $5, %edi
|
||||
callq *%rax
|
||||
popq %rbp
|
||||
ret
|
||||
|
||||
Note that bb1 and bb2 are the same. This doesn't happen at the IR level
|
||||
because one call is passing an i32 and the other is passing an i64.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user