| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
|
| |
These loops are not yet handled.
Fix PR 1912.
llvm-svn: 46484
|
| |
|
|
| |
llvm-svn: 46433
|
| |
|
|
| |
llvm-svn: 46431
|
| |
|
|
| |
llvm-svn: 46429
|
| |
|
|
|
|
|
|
| |
way or the other. Rewriting the code itself prevents subsequent analysis
passes from making contradictory conclusions about the code that could
cause an infeasible path to be made feasible.
llvm-svn: 46427
|
| |
|
|
| |
llvm-svn: 46417
|
| |
|
|
|
|
| |
longer allowed to write through byval arguments.
llvm-svn: 46416
|
| |
|
|
|
|
| |
This fixes PR1769.
llvm-svn: 46408
|
| |
|
|
| |
llvm-svn: 46406
|
| |
|
|
|
|
|
| |
a "nop" instruction so that we don't have the function's label associated
with something that it's not supposed to be associated with.
llvm-svn: 46394
|
| |
|
|
|
|
| |
when inlining a readonly function.
llvm-svn: 46393
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
void bork() {
int *address = 0;
*address = 0;
}
It's compiled into LLVM code that looks like this:
define void @bork() noreturn nounwind {
entry:
unreachable
}
This is bad on some platforms (like PPC) because it will generate the label for
the function but no body. The label could end up being associated with some
non-code related stuff, like a section. This places a "trap" instruction if the
SimplifyCFG pass removed all code from the function leaving only one
"unreachable" instruction.
llvm-svn: 46387
|
| |
|
|
| |
llvm-svn: 46369
|
| |
|
|
|
|
| |
for the purpose of removing end-of-function stores.
llvm-svn: 46351
|
| |
|
|
| |
llvm-svn: 46247
|
| |
|
|
|
|
| |
a smaller bitwidth.
llvm-svn: 46244
|
| |
|
|
|
|
| |
Fixes PR1935.
llvm-svn: 46203
|
| |
|
|
|
|
| |
to complain on x86-64 (gcc 4.1). Use ~0U instead.
llvm-svn: 46197
|
| |
|
|
| |
llvm-svn: 46113
|
| |
|
|
|
|
|
| |
promoted functions. This is important for varargs calls in
particular. Thanks to duncan for providing a great testcase.
llvm-svn: 46108
|
| |
|
|
| |
llvm-svn: 46090
|
| |
|
|
| |
llvm-svn: 46045
|
| |
|
|
|
|
|
|
|
| |
drop attributes on varargs call arguments. Also, it could generate
invalid IR if the transformed call already had the 'nest' attribute
somewhere (this can never happen for code coming from llvm-gcc,
but it's a theoretical possibility). Fix both problems.
llvm-svn: 45973
|
| |
|
|
|
|
|
| |
byval work. This miscompilation is due to the program indexing an array out
of range and us doing a transformation that broke this.
llvm-svn: 45949
|
| |
|
|
| |
llvm-svn: 45948
|
| |
|
|
|
|
| |
difficult to understand the invariants.
llvm-svn: 45947
|
| |
|
|
|
|
| |
easier to show that its safe. No functionality change.
llvm-svn: 45946
|
| |
|
|
|
|
|
|
|
|
| |
a load/store of i64. The later prevents promotion/scalarrepl of the
source and dest in many cases.
This fixes the 300% performance regression of the byval stuff on
stepanov_v1p2.
llvm-svn: 45945
|
| |
|
|
|
|
| |
method, no functionality change.
llvm-svn: 45944
|
| |
|
|
|
|
|
| |
greater than memcpy alignment, and if we lower to load/store, use the best
alignment info we have.
llvm-svn: 45943
|
| |
|
|
|
|
| |
make memmove->memcpy conversion a bit simpler.
llvm-svn: 45942
|
| |
|
|
|
|
|
| |
realize that ne & sgt was a signed comparison (it was only
looking at whether the left compare was signed).
llvm-svn: 45937
|
| |
|
|
| |
llvm-svn: 45932
|
| |
|
|
|
|
|
| |
if this becomes a varargs call then deal correctly with any
parameter attributes on the newly vararg call arguments.
llvm-svn: 45931
|
| |
|
|
|
|
|
| |
inlining a function if we know that the function does not write
to *any* memory. This implements test/Transforms/Inline/byval2.ll
llvm-svn: 45912
|
| |
|
|
|
|
| |
the inliner pass. Patch by Robert Zeh.
llvm-svn: 45903
|
| |
|
|
|
|
| |
attributes on the vararg call arguments are also dropped.
llvm-svn: 45892
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
get away with it, which exposes opportunities to eliminate the memory
objects entirely. For example, we now compile byval.ll to:
define internal void @f1(i32 %b.0, i64 %b.1) {
entry:
%tmp2 = add i32 %b.0, 1 ; <i32> [#uses=0]
ret void
}
define i32 @main() nounwind {
entry:
call void @f1( i32 1, i64 2 )
ret i32 0
}
This seems like it would trigger a lot for code that passes around small
structs (e.g. SDOperand's or _Complex)...
llvm-svn: 45886
|
| |
|
|
| |
llvm-svn: 45878
|
| |
|
|
| |
llvm-svn: 45877
|
| |
|
|
|
|
| |
whether an argument is byval and pass into isSafeToPromoteArgument.
llvm-svn: 45876
|
| |
|
|
| |
llvm-svn: 45875
|
| |
|
|
| |
llvm-svn: 45874
|
| |
|
|
| |
llvm-svn: 45873
|
| |
|
|
|
|
| |
copy of it in case the callee modifies the struct.
llvm-svn: 45853
|
| |
|
|
|
|
| |
arithmetic.
llvm-svn: 45745
|
| |
|
|
|
|
| |
incompatibility.
llvm-svn: 45704
|
| |
|
|
| |
llvm-svn: 45675
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
ShadowStackCollector, which additionally has reduced overhead with
no sacrifice in portability.
Considering a function @fun with 8 loop-local roots,
ShadowStackCollector introduces the following overhead
(x86):
; shadowstack prologue
movl L_llvm_gc_root_chain$non_lazy_ptr, %eax
movl (%eax), %ecx
movl $___gc_fun, 20(%esp)
movl $0, 24(%esp)
movl $0, 28(%esp)
movl $0, 32(%esp)
movl $0, 36(%esp)
movl $0, 40(%esp)
movl $0, 44(%esp)
movl $0, 48(%esp)
movl $0, 52(%esp)
movl %ecx, 16(%esp)
leal 16(%esp), %ecx
movl %ecx, (%eax)
; shadowstack loop overhead
(none)
; shadowstack epilogue
movl 48(%esp), %edx
movl %edx, (%ecx)
; shadowstack metadata
.align 3
___gc_fun: # __gc_fun
.long 8
.space 4
In comparison to LowerGC:
; lowergc prologue
movl L_llvm_gc_root_chain$non_lazy_ptr, %eax
movl (%eax), %ecx
movl %ecx, 48(%esp)
movl $8, 52(%esp)
movl $0, 60(%esp)
movl $0, 56(%esp)
movl $0, 68(%esp)
movl $0, 64(%esp)
movl $0, 76(%esp)
movl $0, 72(%esp)
movl $0, 84(%esp)
movl $0, 80(%esp)
movl $0, 92(%esp)
movl $0, 88(%esp)
movl $0, 100(%esp)
movl $0, 96(%esp)
movl $0, 108(%esp)
movl $0, 104(%esp)
movl $0, 116(%esp)
movl $0, 112(%esp)
; lowergc loop overhead
leal 44(%esp), %eax
movl %eax, 56(%esp)
leal 40(%esp), %eax
movl %eax, 64(%esp)
leal 36(%esp), %eax
movl %eax, 72(%esp)
leal 32(%esp), %eax
movl %eax, 80(%esp)
leal 28(%esp), %eax
movl %eax, 88(%esp)
leal 24(%esp), %eax
movl %eax, 96(%esp)
leal 20(%esp), %eax
movl %eax, 104(%esp)
leal 16(%esp), %eax
movl %eax, 112(%esp)
; lowergc epilogue
movl 48(%esp), %edx
movl %edx, (%ecx)
; lowergc metadata
(none)
llvm-svn: 45670
|
| |
|
|
|
|
|
|
|
| |
direct calls bails out unless caller and callee have essentially
equivalent parameter attributes. This is illogical - the callee's
attributes should be of no relevance here. Rework the logic, which
incidentally fixes a crash when removed arguments have attributes.
llvm-svn: 45658
|