mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-26 22:26:16 +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