xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/handle-move.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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