[Mono-bugs] [Bug 61641][Wis] Changed - Bad register allocation with `if' statements

bugzilla-daemon@bugzilla.ximian.com bugzilla-daemon@bugzilla.ximian.com
Thu, 15 Jul 2004 17:07:11 -0400 (EDT)


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by bmaurer@users.sf.net.

http://bugzilla.ximian.com/show_bug.cgi?id=61641

--- shadow/61641	2004-07-15 16:52:55.000000000 -0400
+++ shadow/61641.tmp.19044	2004-07-15 17:07:11.000000000 -0400
@@ -1,14 +1,14 @@
 Bug#: 61641
 Product: Mono: Runtime
 Version: unspecified
-OS: 
+OS: unknown
 OS Details: 
 Status: NEW   
 Resolution: 
-Severity: 
+Severity: Unknown
 Priority: Wishlist
 Component: misc
 AssignedTo: mono-bugs@ximian.com                            
 ReportedBy: bmaurer@users.sf.net               
 QAContact: mono-bugs@ximian.com
 TargetMilestone: ---
@@ -105,6 +105,448 @@
 VAR 6 00180000 002fffff C43
 VAR 7 001d0000 002effff C43
 VAR 8 00220000 002dffff C43
 VAR 9 00270000 002cffff C43
 
 As you can see, the `x' variables all have overlapping live ranges.
+
+------- Additional Comments From bmaurer@users.sf.net  2004-07-15 17:07 -------
+It seems that ordering by DFN is not good for liveness. When ordered
+by DFN, the blocks are in the following order (this is after SSA
+translation):
+BB0 DFN0 (len: 0): 
+	prev:		succ: BB3
+	idom: BB-1
+	dominators: BB0
+	dfrontier:
+
+BB3 DFN1 (len: 0): 
+ (stind.i4 local[1] iconst[0])
+ (stind.i4 local[2] iconst[0])
+ (stind.i4 local[3] iconst[0])
+ (stind.i4 local[4] iconst[0])
+ (stind.i4 local[5] iconst[0])
+ (stind.i4 local[6] iconst[0])
+ (stind.i4 local[7] iconst[0])
+ (stind.i4 local[8] iconst[0])
+ (stind.i4 local[9] iconst[0])
+ (stind.i4 local[10] iconst[0])
+ br[B4]
+	prev: BB0		succ: BB4
+	idom: BB0
+	dominators: [BB0] BB3
+	dfrontier:
+
+BB4 DFN2 (len: 11): IL_0144: ldloc.0    -> IL_014a: blt       IL_0007
+ (stind.i4 local[11] phi[1 (10, 28)])
+ (blt[B37B54] (compare (ldind.i4 local[11]) iconst[10000]))
+	prev: BB3 BB53		succ: BB37 BB54
+	idom: BB3
+	dominators: BB0 [BB3] BB4
+	dfrontier: BB4
+
+BB37 DFN3 (len: 7): IL_0007: ldloc.0    -> IL_0009: bne.un    IL_0015
+ (bne.un[B5B38] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB4		succ: BB5 BB38
+	idom: BB4
+	dominators: BB0 BB3 [BB4] BB37
+	dfrontier: BB4
+
+BB5 DFN4 (len: 0): IL_0015: ldc.i4.2   -> IL_0016: stloc.1   
+ (stind.i4 local[44] iconst[2])
+	prev: BB37		succ: BB6
+	idom: BB37
+	dominators: BB0 BB3 BB4 [BB37] BB5
+	dfrontier: BB7
+
+BB6 DFN5 (len: 5): IL_0017: br        IL_0020 -> IL_0017: br       
+IL_0020
+ br[B7]
+	prev: BB5		succ: BB7
+	idom: BB5
+	dominators: BB0 BB3 BB4 BB37 [BB5] BB6
+	dfrontier: BB7
+
+BB7 DFN6 (len: 11): IL_0020: ldloc.1    -> IL_0026: blt       IL_001c
+ (stind.i4 local[13] phi[2 (44, 43, 12)])
+ (blt[B8B39] (compare (ldind.i4 local[13]) iconst[10000]))
+	prev: BB6 BB8 BB38		succ: BB8 BB39
+	idom: BB37
+	dominators: BB0 BB3 BB4 [BB37] BB7
+	dfrontier: BB4 BB7
+
+BB8 DFN7 (len: 0): IL_001c: ldloc.1    -> IL_001f: stloc.1   
+ (stind.i4 local[43] (add (ldind.i4 local[13]) iconst[1]))
+	prev: BB7		succ: BB7
+	idom: BB7
+	dominators: BB0 BB3 BB4 BB37 [BB7] BB8
+	dfrontier: BB7
+
+BB39 DFN8 (len: 7): IL_002b: ldloc.0    -> IL_002d: bne.un    IL_0039
+ (bne.un[B9B40] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB7		succ: BB9 BB40
+	idom: BB7
+	dominators: BB0 BB3 BB4 BB37 [BB7] BB39
+	dfrontier: BB4
+
+BB9 DFN9 (len: 0): IL_0039: ldc.i4.2   -> IL_003a: stloc.2   
+ (stind.i4 local[42] iconst[2])
+	prev: BB39		succ: BB10
+	idom: BB39
+	dominators: BB0 BB3 BB4 BB37 BB7 [BB39] BB9
+	dfrontier: BB11
+
+BB10 DFN10 (len: 5): IL_003b: br        IL_0044 -> IL_003b: br       
+IL_0044
+ br[B11]
+	prev: BB9		succ: BB11
+	idom: BB9
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 [BB9] BB10
+	dfrontier: BB11
+
+BB11 DFN11 (len: 11): IL_0044: ldloc.2    -> IL_004a: blt       IL_0040
+ (stind.i4 local[15] phi[3 (42, 41, 14)])
+ (blt[B12B41] (compare (ldind.i4 local[15]) iconst[10000]))
+	prev: BB10 BB12 BB40		succ: BB12 BB41
+	idom: BB39
+	dominators: BB0 BB3 BB4 BB37 BB7 [BB39] BB11
+	dfrontier: BB4 BB11
+
+BB12 DFN12 (len: 0): IL_0040: ldloc.2    -> IL_0043: stloc.2   
+ (stind.i4 local[41] (add (ldind.i4 local[15]) iconst[1]))
+	prev: BB11		succ: BB11
+	idom: BB11
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 [BB11] BB12
+	dfrontier: BB11
+
+BB41 DFN13 (len: 7): IL_004f: ldloc.0    -> IL_0051: bne.un    IL_005d
+ (bne.un[B13B42] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB11		succ: BB13 BB42
+	idom: BB11
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 [BB11] BB41
+	dfrontier: BB4
+
+BB13 DFN14 (len: 0): IL_005d: ldc.i4.2   -> IL_005e: stloc.3   
+ (stind.i4 local[40] iconst[2])
+	prev: BB41		succ: BB14
+	idom: BB41
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 [BB41] BB13
+	dfrontier: BB15
+
+BB14 DFN15 (len: 5): IL_005f: br        IL_0068 -> IL_005f: br       
+IL_0068
+ br[B15]
+	prev: BB13		succ: BB15
+	idom: BB13
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 [BB13] BB14
+	dfrontier: BB15
+
+BB15 DFN16 (len: 11): IL_0068: ldloc.3    -> IL_006e: blt       IL_0064
+ (stind.i4 local[17] phi[4 (40, 39, 16)])
+ (blt[B16B43] (compare (ldind.i4 local[17]) iconst[10000]))
+	prev: BB14 BB16 BB42		succ: BB16 BB43
+	idom: BB41
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 [BB41] BB15
+	dfrontier: BB4 BB15
+
+BB16 DFN17 (len: 0): IL_0064: ldloc.3    -> IL_0067: stloc.3   
+ (stind.i4 local[39] (add (ldind.i4 local[17]) iconst[1]))
+	prev: BB15		succ: BB15
+	idom: BB15
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 [BB15] BB16
+	dfrontier: BB15
+
+BB43 DFN18 (len: 7): IL_0073: ldloc.0    -> IL_0075: bne.un    IL_0082
+ (bne.un[B17B44] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB15		succ: BB17 BB44
+	idom: BB15
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 [BB15] BB43
+	dfrontier: BB4
+
+BB17 DFN19 (len: 0): IL_0082: ldc.i4.2   -> IL_0083: stloc.s   4
+ (stind.i4 local[38] iconst[2])
+	prev: BB43		succ: BB18
+	idom: BB43
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 [BB43] BB17
+	dfrontier: BB19
+
+BB18 DFN20 (len: 5): IL_0085: br        IL_0090 -> IL_0085: br       
+IL_0090
+ br[B19]
+	prev: BB17		succ: BB19
+	idom: BB17
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 [BB17] BB18
+	dfrontier: BB19
+
+BB19 DFN21 (len: 12): IL_0090: ldloc.s   4 -> IL_0097: blt       IL_008a
+ (stind.i4 local[19] phi[5 (38, 37, 18)])
+ (blt[B20B45] (compare (ldind.i4 local[19]) iconst[10000]))
+	prev: BB18 BB20 BB44		succ: BB20 BB45
+	idom: BB43
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 [BB43] BB19
+	dfrontier: BB4 BB19
+
+BB20 DFN22 (len: 0): IL_008a: ldloc.s   4 -> IL_008e: stloc.s   4
+ (stind.i4 local[37] (add (ldind.i4 local[19]) iconst[1]))
+	prev: BB19		succ: BB19
+	idom: BB19
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 [BB19] BB20
+	dfrontier: BB19
+
+BB45 DFN23 (len: 7): IL_009c: ldloc.0    -> IL_009e: bne.un    IL_00ab
+ (bne.un[B21B46] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB19		succ: BB21 BB46
+	idom: BB19
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 [BB19] BB45
+	dfrontier: BB4
+
+BB21 DFN24 (len: 0): IL_00ab: ldc.i4.2   -> IL_00ac: stloc.s   5
+ (stind.i4 local[36] iconst[2])
+	prev: BB45		succ: BB22
+	idom: BB45
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 [BB45]
+BB21
+	dfrontier: BB23
+
+BB22 DFN25 (len: 5): IL_00ae: br        IL_00b9 -> IL_00ae: br       
+IL_00b9
+ br[B23]
+	prev: BB21		succ: BB23
+	idom: BB21
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+[BB21] BB22
+	dfrontier: BB23
+
+BB23 DFN26 (len: 12): IL_00b9: ldloc.s   5 -> IL_00c0: blt       IL_00b3
+ (stind.i4 local[21] phi[6 (36, 35, 20)])
+ (blt[B24B47] (compare (ldind.i4 local[21]) iconst[10000]))
+	prev: BB22 BB24 BB46		succ: BB24 BB47
+	idom: BB45
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 [BB45]
+BB23
+	dfrontier: BB4 BB23
+
+BB24 DFN27 (len: 0): IL_00b3: ldloc.s   5 -> IL_00b7: stloc.s   5
+ (stind.i4 local[35] (add (ldind.i4 local[21]) iconst[1]))
+	prev: BB23		succ: BB23
+	idom: BB23
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+[BB23] BB24
+	dfrontier: BB23
+
+BB47 DFN28 (len: 7): IL_00c5: ldloc.0    -> IL_00c7: bne.un    IL_00d4
+ (bne.un[B25B48] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB23		succ: BB25 BB48
+	idom: BB23
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+[BB23] BB47
+	dfrontier: BB4
+
+BB25 DFN29 (len: 0): IL_00d4: ldc.i4.2   -> IL_00d5: stloc.s   6
+ (stind.i4 local[34] iconst[2])
+	prev: BB47		succ: BB26
+	idom: BB47
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 [BB47] BB25
+	dfrontier: BB27
+
+BB26 DFN30 (len: 5): IL_00d7: br        IL_00e2 -> IL_00d7: br       
+IL_00e2
+ br[B27]
+	prev: BB25		succ: BB27
+	idom: BB25
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 [BB25] BB26
+	dfrontier: BB27
+
+BB27 DFN31 (len: 12): IL_00e2: ldloc.s   6 -> IL_00e9: blt       IL_00dc
+ (stind.i4 local[23] phi[7 (34, 33, 22)])
+ (blt[B28B49] (compare (ldind.i4 local[23]) iconst[10000]))
+	prev: BB26 BB28 BB48		succ: BB28 BB49
+	idom: BB47
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 [BB47] BB27 BB28
+	dfrontier: BB4 BB27
+
+BB28 DFN32 (len: 0): IL_00dc: ldloc.s   6 -> IL_00e0: stloc.s   6
+ (stind.i4 local[33] (add (ldind.i4 local[23]) iconst[1]))
+	prev: BB27		succ: BB27
+	idom: BB27
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 [BB27] BB28
+	dfrontier: BB27
+
+BB49 DFN33 (len: 7): IL_00ee: ldloc.0    -> IL_00f0: bne.un    IL_00fd
+ (bne.un[B29B50] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB27		succ: BB29 BB50
+	idom: BB27
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 [BB27] BB28 BB49
+	dfrontier: BB4
+
+BB29 DFN34 (len: 0): IL_00fd: ldc.i4.2   -> IL_00fe: stloc.s   7
+ (stind.i4 local[32] iconst[2])
+	prev: BB49		succ: BB30
+	idom: BB49
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 [BB49] BB29
+	dfrontier: BB31
+
+BB30 DFN35 (len: 5): IL_0100: br        IL_010b -> IL_0100: br       
+IL_010b
+ br[B31]
+	prev: BB29		succ: BB31
+	idom: BB29
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 [BB29] BB30
+	dfrontier: BB31
+
+BB31 DFN36 (len: 12): IL_010b: ldloc.s   7 -> IL_0112: blt       IL_0105
+ (stind.i4 local[25] phi[8 (32, 31, 24)])
+ (blt[B32B51] (compare (ldind.i4 local[25]) iconst[10000]))
+	prev: BB30 BB32 BB50		succ: BB32 BB51
+	idom: BB49
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 [BB49] BB31
+	dfrontier: BB4 BB31
+
+BB32 DFN37 (len: 0): IL_0105: ldloc.s   7 -> IL_0109: stloc.s   7
+ (stind.i4 local[31] (add (ldind.i4 local[25]) iconst[1]))
+	prev: BB31		succ: BB31
+	idom: BB31
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 [BB31] BB32
+	dfrontier: BB31
+
+BB51 DFN38 (len: 7): IL_0117: ldloc.0    -> IL_0119: bne.un    IL_0126
+ (bne.un[B33B52] (compare (ldind.i4 local[11]) iconst[1]))
+	prev: BB31		succ: BB33 BB52
+	idom: BB31
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 [BB31] BB51
+	dfrontier: BB4
+
+BB33 DFN39 (len: 0): IL_0126: ldc.i4.2   -> IL_0127: stloc.s   8
+ (stind.i4 local[30] iconst[2])
+	prev: BB51		succ: BB34
+	idom: BB51
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 [BB51] BB33
+	dfrontier: BB35
+
+BB34 DFN40 (len: 5): IL_0129: br        IL_0134 -> IL_0129: br       
+IL_0134
+ br[B35]
+	prev: BB33		succ: BB35
+	idom: BB33
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 BB51 [BB33] BB34
+	dfrontier: BB35
+
+BB35 DFN41 (len: 12): IL_0134: ldloc.s   8 -> IL_013b: blt       IL_012e
+ (stind.i4 local[27] phi[9 (30, 29, 26)])
+ (blt[B36B53] (compare (ldind.i4 local[27]) iconst[10000]))
+	prev: BB34 BB36 BB52		succ: BB36 BB53
+	idom: BB51
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 [BB51] BB35
+	dfrontier: BB4 BB35
+
+BB36 DFN42 (len: 0): IL_012e: ldloc.s   8 -> IL_0132: stloc.s   8
+ (stind.i4 local[29] (add (ldind.i4 local[27]) iconst[1]))
+	prev: BB35		succ: BB35
+	idom: BB35
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 BB51 [BB35] BB36
+	dfrontier: BB35
+
+BB53 DFN43 (len: 0): IL_0140: ldloc.0    -> IL_0143: stloc.0   
+ (stind.i4 local[28] (add (ldind.i4 local[11]) iconst[1]))
+	prev: BB35		succ: BB4
+	idom: BB35
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 BB51 [BB35] BB53
+	dfrontier: BB4
+
+BB52 DFN44 (len: 8): IL_011e: ldc.i4.1   -> IL_0121: br        IL_0129
+ (stind.i4 local[26] iconst[1])
+ br[B35]
+	prev: BB51		succ: BB35
+	idom: BB51
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 BB49 BB31 [BB51] BB52
+	dfrontier: BB35
+
+BB50 DFN45 (len: 8): IL_00f5: ldc.i4.1   -> IL_00f8: br        IL_0100
+ (stind.i4 local[24] iconst[1])
+ br[B31]
+	prev: BB49		succ: BB31
+	idom: BB49
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 BB47 BB27 BB28 [BB49] BB50
+	dfrontier: BB31
+
+BB48 DFN46 (len: 8): IL_00cc: ldc.i4.1   -> IL_00cf: br        IL_00d7
+ (stind.i4 local[22] iconst[1])
+ br[B27]
+	prev: BB47		succ: BB27
+	idom: BB47
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 BB45
+BB23 [BB47] BB48
+	dfrontier: BB27
+
+BB46 DFN47 (len: 8): IL_00a3: ldc.i4.1   -> IL_00a6: br        IL_00ae
+ (stind.i4 local[20] iconst[1])
+ br[B23]
+	prev: BB45		succ: BB23
+	idom: BB45
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 BB43 BB19 [BB45]
+BB46
+	dfrontier: BB23
+
+BB44 DFN48 (len: 8): IL_007a: ldc.i4.1   -> IL_007d: br        IL_0085
+ (stind.i4 local[18] iconst[1])
+ br[B19]
+	prev: BB43		succ: BB19
+	idom: BB43
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 BB41 BB15 [BB43] BB44
+	dfrontier: BB19
+
+BB42 DFN49 (len: 7): IL_0056: ldc.i4.1   -> IL_0058: br        IL_005f
+ (stind.i4 local[16] iconst[1])
+ br[B15]
+	prev: BB41		succ: BB15
+	idom: BB41
+	dominators: BB0 BB3 BB4 BB37 BB7 BB39 BB11 [BB41] BB42
+	dfrontier: BB15
+
+BB40 DFN50 (len: 7): IL_0032: ldc.i4.1   -> IL_0034: br        IL_003b
+ (stind.i4 local[14] iconst[1])
+ br[B11]
+	prev: BB39		succ: BB11
+	idom: BB39
+	dominators: BB0 BB3 BB4 BB37 BB7 [BB39] BB40
+	dfrontier: BB11
+
+BB38 DFN51 (len: 7): IL_000e: ldc.i4.1   -> IL_0010: br        IL_0017
+ (stind.i4 local[12] iconst[1])
+ br[B7]
+	prev: BB37		succ: BB7
+	idom: BB37
+	dominators: BB0 BB3 BB4 [BB37] BB38
+	dfrontier: BB7
+
+BB54 DFN52 (len: 1): IL_014f: ret        -> IL_014f: ret       
+ nop
+	prev: BB4		succ: BB1
+	idom: BB4
+	dominators: BB0 BB3 [BB4] BB54
+	dfrontier:
+
+BB1 DFN53 (len: 0): 
+	prev: BB54		succ:
+	idom: BB54
+	dominators: BB0 BB3 BB4 [BB54] BB1
+	dfrontier:
+
+Notice how all the x = 1 statements are at the end. This makes all the
+x variables have overlapping live ranges.