diff options
| author | Graydon Hoare <[email protected]> | 2010-08-26 14:32:47 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-08-26 14:32:47 -0700 |
| commit | ee04c0236c731a1ca3f3a885c16bce5e1ae0a72d (patch) | |
| tree | ac20ca26193a815f62ca70cf90f27fd15daa0e62 /src | |
| parent | un-XFAIL lib-map.rs now that rust stacks are large and it passes on linux. (diff) | |
| download | rust-ee04c0236c731a1ca3f3a885c16bce5e1ae0a72d.tar.xz rust-ee04c0236c731a1ca3f3a885c16bce5e1ae0a72d.zip | |
Add check to catch bug underlying issue #152. Fix will take longer.
Diffstat (limited to 'src')
| -rw-r--r-- | src/boot/be/ra.ml | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/boot/be/ra.ml b/src/boot/be/ra.ml index 3da474b4..244bfcc4 100644 --- a/src/boot/be/ra.ml +++ b/src/boot/be/ra.ml @@ -563,7 +563,20 @@ let reg_alloc let clobbers = cx.ctxt_abi.Abi.abi_clobbers quad in let used = quad_used_vregs quad in let defined = quad_defined_vregs quad in + + let vreg_constrs v = (v, Bits.to_list (vreg_constraints.(v))) in + let used_constrs = List.map vreg_constrs used in + let constrs_collide (v1,c1) = + if List.length c1 <> 1 + then false + else + List.exists + (fun (v2,c2) -> if v1 = v2 then false else c1 = c2) + used_constrs + in begin + if List.exists constrs_collide used_constrs + then raise (Ra_error ("over-constrained vregs")); if List.exists (fun def -> List.mem def clobbers) defined then raise (Ra_error ("clobber and defined sets overlap")); iflog cx @@ -629,7 +642,7 @@ let reg_alloc with Ra_error s -> - Session.fail sess "RA Error: %s" s; + Session.fail sess "RA error: %s\n" s; (quads, 0) ;; |