1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 -mcpu=core2 -fast-isel -enable-misched -misched=shuffle -misched-bottomup -verify-machineinstrs < %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 -mcpu=core2 -fast-isel -enable-misched -misched=shuffle -misched-topdown -verify-machineinstrs < %s 3*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; Test the LiveIntervals::handleMove() function. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; Moving the DIV32r instruction exercises the regunit update code because 8*9880d681SAndroid Build Coastguard Worker; %EDX has a live range into the function and is used by the DIV32r. 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker; Here sinking a kill + dead def: 11*9880d681SAndroid Build Coastguard Worker; 144B -> 180B: DIV32r %vreg4, %EAX<imp-def>, %EDX<imp-def,dead>, %EFLAGS<imp-def,dead>, %EAX<imp-use,kill>, %EDX<imp-use> 12*9880d681SAndroid Build Coastguard Worker; %vreg4: [48r,144r:0) 0@48r 13*9880d681SAndroid Build Coastguard Worker; --> [48r,180r:0) 0@48r 14*9880d681SAndroid Build Coastguard Worker; DH: [0B,16r:0)[128r,144r:2)[144r,144d:1) 0@0B-phi 1@144r 2@128r 15*9880d681SAndroid Build Coastguard Worker; --> [0B,16r:0)[128r,180r:2)[180r,180d:1) 0@0B-phi 1@180r 2@128r 16*9880d681SAndroid Build Coastguard Worker; DL: [0B,16r:0)[128r,144r:2)[144r,144d:1) 0@0B-phi 1@144r 2@128r 17*9880d681SAndroid Build Coastguard Worker; --> [0B,16r:0)[128r,180r:2)[180r,180d:1) 0@0B-phi 1@180r 2@128r 18*9880d681SAndroid Build Coastguard Worker; 19*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %a, i32 %b, i32 %c) nounwind uwtable readnone ssp { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %y = add i32 %c, 1 22*9880d681SAndroid Build Coastguard Worker %x = udiv i32 %b, %a 23*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %y, %x 24*9880d681SAndroid Build Coastguard Worker ret i32 %add 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Same as above, but moving a kill + live def: 28*9880d681SAndroid Build Coastguard Worker; 144B -> 180B: DIV32r %vreg4, %EAX<imp-def,dead>, %EDX<imp-def>, %EFLAGS<imp-def,dead>, %EAX<imp-use,kill>, %EDX<imp-use> 29*9880d681SAndroid Build Coastguard Worker; %vreg4: [48r,144r:0) 0@48r 30*9880d681SAndroid Build Coastguard Worker; --> [48r,180r:0) 0@48r 31*9880d681SAndroid Build Coastguard Worker; DH: [0B,16r:0)[128r,144r:2)[144r,184r:1) 0@0B-phi 1@144r 2@128r 32*9880d681SAndroid Build Coastguard Worker; --> [0B,16r:0)[128r,180r:2)[180r,184r:1) 0@0B-phi 1@180r 2@128r 33*9880d681SAndroid Build Coastguard Worker; DL: [0B,16r:0)[128r,144r:2)[144r,184r:1) 0@0B-phi 1@144r 2@128r 34*9880d681SAndroid Build Coastguard Worker; --> [0B,16r:0)[128r,180r:2)[180r,184r:1) 0@0B-phi 1@180r 2@128r 35*9880d681SAndroid Build Coastguard Worker; 36*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a, i32 %b, i32 %c, i32 %d) nounwind uwtable readnone ssp { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %y = sub i32 %c, %d 39*9880d681SAndroid Build Coastguard Worker %x = urem i32 %b, %a 40*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %x, %y 41*9880d681SAndroid Build Coastguard Worker ret i32 %add 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Moving a use below the existing kill (%vreg5): 45*9880d681SAndroid Build Coastguard Worker; Moving a tied virtual register def (%vreg11): 46*9880d681SAndroid Build Coastguard Worker; 47*9880d681SAndroid Build Coastguard Worker; 96B -> 120B: %vreg11<def,tied1> = SUB32rr %vreg11<tied0>, %vreg5 48*9880d681SAndroid Build Coastguard Worker; %vreg11: [80r,96r:1)[96r,144r:0) 0@96r 1@80r 49*9880d681SAndroid Build Coastguard Worker; --> [80r,120r:1)[120r,144r:0) 0@120r 1@80r 50*9880d681SAndroid Build Coastguard Worker; %vreg5: [16r,112r:0) 0@16r 51*9880d681SAndroid Build Coastguard Worker; --> [16r,120r:0) 0@16r 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %a, i32 %b) nounwind uwtable readnone ssp { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker %y = sub i32 %a, %b 56*9880d681SAndroid Build Coastguard Worker %x = add i32 %a, %b 57*9880d681SAndroid Build Coastguard Worker %r = mul i32 %x, %y 58*9880d681SAndroid Build Coastguard Worker ret i32 %r 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; Move EFLAGS dead def across another def: 62*9880d681SAndroid Build Coastguard Worker; handleMove 208B -> 36B: %EDX<def> = MOV32r0 %EFLAGS<imp-def,dead> 63*9880d681SAndroid Build Coastguard Worker; EFLAGS: [20r,20d:4)[160r,160d:3)[208r,208d:0)[224r,224d:1)[272r,272d:2)[304r,304d:5) 0@208r 1@224r 2@272r 3@160r 4@20r 5@304r 64*9880d681SAndroid Build Coastguard Worker; --> [20r,20d:4)[36r,36d:0)[160r,160d:3)[224r,224d:1)[272r,272d:2)[304r,304d:5) 0@36r 1@224r 2@272r 3@160r 4@20r 5@304r 65*9880d681SAndroid Build Coastguard Worker; 66*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a, i32 %b, i32 %c, i32 %d) nounwind uwtable readnone ssp { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker %x = sub i32 %a, %b 69*9880d681SAndroid Build Coastguard Worker %y = sub i32 %b, %c 70*9880d681SAndroid Build Coastguard Worker %z = sub i32 %c, %d 71*9880d681SAndroid Build Coastguard Worker %r1 = udiv i32 %x, %y 72*9880d681SAndroid Build Coastguard Worker %r2 = mul i32 %z, %r1 73*9880d681SAndroid Build Coastguard Worker ret i32 %r2 74*9880d681SAndroid Build Coastguard Worker} 75