#
f26beda7 |
| 25-Jan-2014 |
Juergen Ributzka <juergen@apple.com> |
Revert "Revert "Add Constant Hoisting Pass" (r200034)"
This reverts commit r200058 and adds the using directive for ARMTargetTransformInfo to silence two g++ overload warnings.
llvm-svn: 200062
|
#
4d67a2e8 |
| 25-Jan-2014 |
Hans Wennborg <hans@hanshq.net> |
Revert "Add Constant Hoisting Pass" (r200034)
This commit caused -Woverloaded-virtual warnings. The two new TargetTransformInfo::getIntImmCost functions were only added to the superclass, and to the
Revert "Add Constant Hoisting Pass" (r200034)
This commit caused -Woverloaded-virtual warnings. The two new TargetTransformInfo::getIntImmCost functions were only added to the superclass, and to the X86 subclass. The other targets were not updated, and the warning highlighted this by pointing out that e.g. ARMTTI::getIntImmCost was hiding the two new getIntImmCost variants.
We could pacify the warning by adding "using TargetTransformInfo::getIntImmCost" to the various subclasses, or turning it off, but I suspect that it's wrong to leave the functions unimplemnted in those targets. The default implementations return TCC_Free, which I don't think is right e.g. for ARM.
llvm-svn: 200058
show more ...
|
#
4f3df4ad |
| 24-Jan-2014 |
Juergen Ributzka <juergen@apple.com> |
Add Constant Hoisting Pass
Retry commit r200022 with a fix for the build bot errors. Constant expressions have (unlike instructions) module scope use lists and therefore may have users in different
Add Constant Hoisting Pass
Retry commit r200022 with a fix for the build bot errors. Constant expressions have (unlike instructions) module scope use lists and therefore may have users in different functions. The fix is to simply ignore these out-of-function uses.
llvm-svn: 200034
show more ...
|
#
50e7e80d |
| 24-Jan-2014 |
Juergen Ributzka <juergen@apple.com> |
Revert "Add Constant Hoisting Pass"
This reverts commit r200022 to unbreak the build bots.
llvm-svn: 200024
|
#
38b67d0c |
| 24-Jan-2014 |
Juergen Ributzka <juergen@apple.com> |
Add Constant Hoisting Pass
This pass identifies expensive constants to hoist and coalesces them to better prepare it for SelectionDAG-based code generation. This works around the limitations of the
Add Constant Hoisting Pass
This pass identifies expensive constants to hoist and coalesces them to better prepare it for SelectionDAG-based code generation. This works around the limitations of the basic-block-at-a-time approach.
First it scans all instructions for integer constants and calculates its cost. If the constant can be folded into the instruction (the cost is TCC_Free) or the cost is just a simple operation (TCC_BASIC), then we don't consider it expensive and leave it alone. This is the default behavior and the default implementation of getIntImmCost will always return TCC_Free.
If the cost is more than TCC_BASIC, then the integer constant can't be folded into the instruction and it might be beneficial to hoist the constant. Similar constants are coalesced to reduce register pressure and materialization code.
When a constant is hoisted, it is also hidden behind a bitcast to force it to be live-out of the basic block. Otherwise the constant would be just duplicated and each basic block would have its own copy in the SelectionDAG. The SelectionDAG recognizes such constants as opaque and doesn't perform certain transformations on them, which would create a new expensive constant.
This optimization is only applied to integer constants in instructions and simple (this means not nested) constant cast experessions. For example: %0 = load i64* inttoptr (i64 big_constant to i64*)
Reviewed by Eric
llvm-svn: 200022
show more ...
|
#
b5262d6d |
| 12-Jan-2014 |
Nico Rieck <nico.rieck@gmail.com> |
Fix non-deterministic SDNodeOrder-dependent codegen
Reset SelectionDAGBuilder's SDNodeOrder to ensure deterministic code generation.
llvm-svn: 199050
|
Revision tags: llvmorg-3.4.0 |
|
#
22b8ba2d |
| 19-Dec-2013 |
Josh Magee <joshua_magee@playstation.sony.com> |
[stackprotector] Use analysis from the StackProtector pass for stack layout in PEI a nd LocalStackSlot passes.
This changes the MachineFrameInfo API to use the new SSPLayoutKind information produced
[stackprotector] Use analysis from the StackProtector pass for stack layout in PEI a nd LocalStackSlot passes.
This changes the MachineFrameInfo API to use the new SSPLayoutKind information produced by the StackProtector pass (instead of a boolean flag) and updates a few pass dependencies (to preserve the SSP analysis).
The stack layout follows the same approach used prior to this change - i.e., only LargeArray stack objects will be placed near the canary and everything else will be laid out normally. After this change, structures containing large arrays will also be placed near the canary - a case previously missed by the old implementation.
Out of tree targets will need to update their usage of MachineFrameInfo::CreateStackObject to remove the MayNeedSP argument.
The next patch will implement the rules for sspstrong and sspreq. The end goal is to support ssp-strong stack layout rules.
WIP.
Differential Revision: http://llvm-reviews.chandlerc.com/D2158
llvm-svn: 197653
show more ...
|
Revision tags: llvmorg-3.4.0-rc3 |
|
#
e8294753 |
| 14-Dec-2013 |
Juergen Ributzka <juergen@apple.com> |
[Stackmap] Liveness Analysis Pass
This optional register liveness analysis pass can be enabled with either -enable-stackmap-liveness, -enable-patchpoint-liveness, or both. The pass traverses each ba
[Stackmap] Liveness Analysis Pass
This optional register liveness analysis pass can be enabled with either -enable-stackmap-liveness, -enable-patchpoint-liveness, or both. The pass traverses each basic block in a machine function. For each basic block the instructions are processed in reversed order and if a patchpoint or stackmap instruction is encountered the current live-out register set is encoded as a register mask and attached to the instruction.
Later on during stackmap generation the live-out register mask is processed and also emitted as part of the stackmap.
This information is optional and intended for optimization purposes only. This will enable a client of the stackmap to reason about the registers it can use and which registers need to be preserved.
Reviewed by Andy
llvm-svn: 197317
show more ...
|
#
7bcb0100 |
| 13-Dec-2013 |
Andrew Trick <atrick@apple.com> |
Revert "Liveness Analysis Pass"
This reverts commit r197254.
This was an accidental merge of Juergen's patch. It will be checked in shortly, but wasn't meant to go in quite yet.
Conflicts: includ
Revert "Liveness Analysis Pass"
This reverts commit r197254.
This was an accidental merge of Juergen's patch. It will be checked in shortly, but wasn't meant to go in quite yet.
Conflicts: include/llvm/CodeGen/StackMaps.h lib/CodeGen/StackMaps.cpp test/CodeGen/X86/stackmap-liveness.ll
llvm-svn: 197260
show more ...
|
#
e8cba373 |
| 13-Dec-2013 |
Andrew Trick <atrick@apple.com> |
Grow the stackmap/patchpoint format to hold 64-bit IDs.
llvm-svn: 197255
|
#
8d6a6584 |
| 13-Dec-2013 |
Andrew Trick <atrick@apple.com> |
Liveness Analysis Pass
llvm-svn: 197254
|
#
671a5962 |
| 11-Dec-2013 |
Benjamin Kramer <benny.kra@googlemail.com> |
SelectionDAG: Fix a typo.
Found by "cppcheck". PR18208.
llvm-svn: 197047
|
#
ee08897f |
| 10-Dec-2013 |
Reid Kleckner <reid@kleckner.net> |
Reland "Fix miscompile of MS inline assembly with stack realignment"
This re-lands commit r196876, which was reverted in r196879.
The tests have been fixed to pass on platforms with a stack alignme
Reland "Fix miscompile of MS inline assembly with stack realignment"
This re-lands commit r196876, which was reverted in r196879.
The tests have been fixed to pass on platforms with a stack alignment larger than 4.
Update to clang side tests will land shortly.
llvm-svn: 196939
show more ...
|
#
9afe613d |
| 10-Dec-2013 |
Richard Sandiford <rsandifo@linux.vnet.ibm.com> |
Add TargetLowering::prepareVolatileOrAtomicLoad
One unusual feature of the z architecture is that the result of a previous load can be reused indefinitely for subsequent loads, even if a cache-coher
Add TargetLowering::prepareVolatileOrAtomicLoad
One unusual feature of the z architecture is that the result of a previous load can be reused indefinitely for subsequent loads, even if a cache-coherent store to that location is performed by another CPU. A special serializing instruction must be used if you want to force a load to be reattempted.
Since volatile loads are not supposed to be omitted in this way, we should insert a serializing instruction before each such load. The same goes for atomic loads.
The patch implements this at the IR->DAG boundary, in a similar way to atomic fences. It is a no-op for targets other than SystemZ.
llvm-svn: 196905
show more ...
|
#
0a9509f0 |
| 10-Dec-2013 |
Reid Kleckner <reid@kleckner.net> |
Revert "Fix miscompile of MS inline assembly with stack realignment"
This reverts commit r196876. Its tests failed on the bots, so I'll figure it out tomorrow.
llvm-svn: 196879
|
#
7f10a8cd |
| 10-Dec-2013 |
Reid Kleckner <reid@kleckner.net> |
Fix miscompile of MS inline assembly with stack realignment
For stack frames requiring realignment, three pointers may be needed: - ebp to address incoming arguments - esi (could be any callee-saved
Fix miscompile of MS inline assembly with stack realignment
For stack frames requiring realignment, three pointers may be needed: - ebp to address incoming arguments - esi (could be any callee-saved register) to address locals - esp to address outgoing arguments
We would use esi unconditionally without verifying that it did not conflict with inline assembly.
This change doesn't do the verification, it simply emits a fatal error on functions that use stack realignment, dynamic SP adjustments, and inline assembly.
Because stack realignment is common on Windows, we also no longer assume that MS inline assembly clobbers esp. Instead, we analyze the inline instructions for implicit definitions and check if esp is there. If so, we require the use of a base pointer and consider it in the condition above.
Mostly fixes PR16830, but we could try harder to find a non-conflicting base pointer.
Reviewers: sunfish
Differential Revision: http://llvm-reviews.chandlerc.com/D1317
llvm-svn: 196876
show more ...
|
#
d50dbc78 |
| 05-Dec-2013 |
Rafael Espindola <rafael.espindola@gmail.com> |
Try harder to get a consistent floating point results.
This just extends the existing hack. It should be enough to get a reproducible bootstrap on 32 bits.
I will open a bug to track getting a real
Try harder to get a consistent floating point results.
This just extends the existing hack. It should be enough to get a reproducible bootstrap on 32 bits.
I will open a bug to track getting a real fix for this.
llvm-svn: 196462
show more ...
|
Revision tags: llvmorg-3.4.0-rc2 |
|
#
391dbadb |
| 26-Nov-2013 |
Andrew Trick <atrick@apple.com> |
StackMap: Implement support for DirectMemRefOp.
A Direct stack map location records the address of frame index. This address is itself the value that the runtime requested. This differs from Indirec
StackMap: Implement support for DirectMemRefOp.
A Direct stack map location records the address of frame index. This address is itself the value that the runtime requested. This differs from IndirectMemRefOp locations, which refer to a stack locations from which the requested values must be loaded. Direct locations can directly communicate the address if an alloca, while IndirectMemRefOp handle register spills.
For example:
entry: %a = alloca i64... llvm.experimental.stackmap(i32 <ID>, i32 <shadowBytes>, i64* %a)
Since both the alloca and stackmap intrinsic are in the entry block, and the intrinsic takes the address of the alloca, the runtime can assume that LLVM will not substitute alloca with any intervening value. This must be verified by the runtime by checking that the stack map's location is a Direct location type. The runtime can then determine the alloca's relative location on the stack immediately after compilation, or at any time thereafter. This differs from Register and Indirect locations, because the runtime can only read the values in those locations when execution reaches the instruction address of the stack map.
llvm-svn: 195712
show more ...
|
#
4a1abb7a |
| 22-Nov-2013 |
Andrew Trick <atrick@apple.com> |
patchpoint: factor SD builder code for live vars. Plain stackmap also optimizes Constant values now.
llvm-svn: 195488
|
#
a2428e0f |
| 22-Nov-2013 |
Andrew Trick <atrick@apple.com> |
patchpoint: eliminate hard coded operand indices.
llvm-svn: 195487
|
Revision tags: llvmorg-3.4.0-rc1 |
|
#
19231e63 |
| 16-Nov-2013 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
Fix codegen for null different sized pointer.
llvm-svn: 194932
|
#
b03bd4d9 |
| 15-Nov-2013 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
Add addrspacecast instruction.
Patch by Michele Scandale!
llvm-svn: 194760
|
#
561f2218 |
| 14-Nov-2013 |
Andrew Trick <atrick@apple.com> |
Minor extension to llvm.experimental.patchpoint: don't require a call.
If a null call target is provided, don't emit a dummy call. This allows the runtime to reserve as little nop space as it needs
Minor extension to llvm.experimental.patchpoint: don't require a call.
If a null call target is provided, don't emit a dummy call. This allows the runtime to reserve as little nop space as it needs without the requirement of emitting a call.
llvm-svn: 194676
show more ...
|
#
87ed906b |
| 09-Nov-2013 |
Juergen Ributzka <juergen@apple.com> |
[Stackmap] Materialize the jump address within the patchpoint noop slide.
This patch moves the jump address materialization inside the noop slide. This enables patching of the materialization itself
[Stackmap] Materialize the jump address within the patchpoint noop slide.
This patch moves the jump address materialization inside the noop slide. This enables patching of the materialization itself or its complete removal. This patch also adds the ability to define scratch registers that can be used safely by the code called from the patchpoint intrinsic. At least one scratch register is required, because that one is used for the materialization of the jump address. This patch depends on D2009.
Differential Revision: http://llvm-reviews.chandlerc.com/D2074
Reviewed by Andy
llvm-svn: 194306
show more ...
|
#
9969d3e6 |
| 08-Nov-2013 |
Juergen Ributzka <juergen@apple.com> |
[Stackmap] Add AnyReg calling convention support for patchpoint intrinsic.
The idea of the AnyReg Calling Convention is to provide the call arguments in registers, but not to force them to be placed
[Stackmap] Add AnyReg calling convention support for patchpoint intrinsic.
The idea of the AnyReg Calling Convention is to provide the call arguments in registers, but not to force them to be placed in a paticular order into a specified set of registers. Instead it is up tp the register allocator to assign any register as it sees fit. The same applies to the return value (if applicable).
Differential Revision: http://llvm-reviews.chandlerc.com/D2009
Reviewed by Andy
llvm-svn: 194293
show more ...
|