Commit Graph

21 Commits

Author SHA1 Message Date
Eduard Burtescu
f1f453cf3b trans: generalize OperandValue::FatPtr to all pairs of immediates. 2016-06-05 14:41:02 +03:00
Eduard Burtescu
156b1fb9e1 Add a new Assert terminator to MIR for bounds & arithmetic checks. 2016-06-05 14:41:02 +03:00
Ariel Ben-Yehuda
1ae7ae0c1c fix translation of terminators in MSVC cleanup blocks
MSVC requires unwinding code to be split to a tree of *funclets*, where each funclet
can only branch to itself or to to its parent.

Luckily, the code we generates matches this pattern. Recover that structure in
an analyze pass and translate according to that.
2016-06-04 13:26:32 +03:00
Ariel Ben-Yehuda
4fff19528b remove filling on drop 2016-06-03 16:11:18 +03:00
Ariel Ben-Yehuda
de7cb0fdd6 introduce DropAndReplace for translating assignments
this introduces a DropAndReplace terminator as a fix to #30380. That terminator
is suppsoed to be translated by desugaring during drop elaboration, which is
not implemented in this commit, so this breaks `-Z orbit` temporarily.
2016-06-03 16:11:18 +03:00
Björn Steinbrink
49b2cdf47c [MIR trans] Optimize trans for biased switches
Currently, all switches in MIR are exhausitive, meaning that we can have
a lot of arms that all go to the same basic block, the extreme case
being an if-let expression which results in just 2 possible cases, be
might end up with hundreds of arms for large enums.

To improve this situation and give LLVM less code to chew on, we can
detect whether there's a pre-dominant target basic block in a switch
and then promote this to be the default target, not translating the
corresponding arms at all.

In combination with #33544 this makes unoptimized MIR trans of
nickel.rs as fast as using old trans and greatly improves the times for
optimized builds, which are only 30-40% slower instead of ~300%.

cc #33111
2016-05-11 22:18:46 +02:00
bors
04308ceefa Auto merge of #33488 - eddyb:trans-fixes, r=Aatch
Fix several -Z orbit crater blockers.

Fixes 3 of the issues found by @nikomatsakis' crater run with `-Z orbit` forced on:
https://gist.github.com/nikomatsakis/6688c30a0e5d3fed07cc1ebd4efb1412

Two of the regressions seemed to be fixed by #33130 and the remaining two are timeouts.
2016-05-10 10:40:02 -07:00
Michael Woerister
75bf6173e5 trans: Make glue::get_drop_glue_type() independent of CrateContext. 2016-05-09 16:17:00 -04:00
Eduard Burtescu
d460597e33 trans: monomorphize varidiac call argument types. 2016-05-09 22:52:01 +03:00
Eduard Burtescu
5c42e694cb trans: support simd_shuffle using MIR constants for indices. 2016-05-07 19:14:33 +03:00
Eduard Burtescu
e1eca0a110 Translate constants from MIR instead of going through trans::expr/consts. 2016-05-07 07:19:10 +03:00
James Miller
5bda576cd6 Factor out function call checking to a helper method
The logic for checking `call` and `invoke` instructions was duplicated
between them, so factor it out to a helper method.
2016-04-28 13:18:51 +12:00
James Miller
3bcee269b5 Handle immediate tuples in trans_arguments_untupled
Use either getelementptr or extractvalue depending on whether or not the
tuple is immediate or not.
2016-04-28 13:18:51 +12:00
Eduard Burtescu
ce8d4a2134 trans: initial implementation of MIR debuginfo. 2016-04-11 20:51:45 +03:00
James Miller
cb1bec9096 Fix some type-related bugs
Some types weren't being properly monomorphised, and didn't have their
regions properly erased. This is now fixed.

Also fixes an issue where a temp was initialized in two separate
branches, but wasn't given an alloca.
2016-04-08 15:37:56 +12:00
James Miller
73790f02e3 Move ReturnDest creation into a method
It's quite a large amount of code, and moving it into a method allowed
for some refactoring to make the logic a little easier to understand
2016-04-06 17:57:42 +12:00
James Miller
e4d4fa3295 Handle operand temps for function calls
This allows temporary destinations for function calls to have their
allocas omitted.
2016-04-04 19:21:27 +12:00
bors
c0b8c43820 Auto merge of #32210 - Aatch:mir-traversal, r=nikomatsakis
rBreak Critical Edges and other MIR work

This PR is built on top of #32080.

This adds the basic depth-first traversals for MIR, preorder, postorder and reverse postorder. The MIR blocks are now translated using reverse postorder. There is also a transform for breaking critical edges, which includes the edges from `invoke`d calls (`Drop` and `Call`), to account for the fact that we can't add code after an `invoke`. It also stops generating the intermediate block (since the transform essentially does it if necessary already).

The kinds of cases this deals with are difficult to produce, so the test is the one I managed to get. However, it seems to bootstrap with `-Z orbit`, which it didn't before my changes.
2016-04-03 08:58:59 -07:00
Benjamin Herr
c59ea491ea librustc_trans: use bug!(), span_bug!() 2016-03-31 22:06:52 +02:00
James Miller
eee7f3c732 Add and use a break critical edges transform
This is a fairly standard transform that inserts blocks along critical
edges so code can be inserted along the edge without it affecting other
edges. The main difference is that it considers a Drop or Call
terminator that would require an `invoke` instruction in LLVM a critical
edge. This is because we can't actually insert code after an invoke, so
it ends up looking similar to a critical edge anyway.

The transform is run just before translation right now.
2016-03-30 12:59:57 +13:00
Eduard Burtescu
035a645e64 rustc_trans: move the contents of the trans module to top-level. 2016-03-27 01:23:28 +02:00