xref: /llvm-project/llvm/test/CodeGen/PowerPC/fold-frame-offset-using-rr.mir (revision 68c6d7e11c51a3ee9079b5cc84ba88a65adcd1c2)
102cbdbdaSChen Zheng# RUN: llc -mtriple=powerpc64le--linux-gnu -stop-after ppc-pre-emit-peephole %s -o - -verify-machineinstrs | FileCheck %s
202cbdbdaSChen Zheng
302cbdbdaSChen Zheng# ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, OffsetAddi
402cbdbdaSChen Zheng# ADD instr:  ToBeDeletedReg = ADD ToBeChangedReg(killed), ScaleReg
502cbdbdaSChen Zheng# Imm instr:  Reg            = op OffsetImm, ToBeDeletedReg(killed)
602cbdbdaSChen Zheng#
702cbdbdaSChen Zheng# can be folded to:
802cbdbdaSChen Zheng#
902cbdbdaSChen Zheng# new ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, (OffsetAddi + OffsetImm)
1002cbdbdaSChen Zheng# Index instr:    Reg            = opx ScaleReg, ToBeChangedReg(killed)
1102cbdbdaSChen Zheng
1202cbdbdaSChen Zheng---
1302cbdbdaSChen Zhengname: testIndexForm1
1402cbdbdaSChen Zheng#CHECK: name: testIndexForm1
1502cbdbdaSChen Zheng# ToBeDeletedReg equals to ScaleReg
1602cbdbdaSChen ZhengtracksRegLiveness: true
1702cbdbdaSChen Zhengbody: |
1802cbdbdaSChen Zheng  bb.0.entry:
1902cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
2002cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
2182205914Sczhengsz    ; CHECK: $x3 = ADDI8 $x1, -76
2202cbdbdaSChen Zheng    $x4 = ADD8 killed $x3, killed $x4
2382205914Sczhengsz    ; CHECK-NOT: ADD8
2402cbdbdaSChen Zheng    $x6 = LD 4, killed $x4
2582205914Sczhengsz    ; CHECK: $x6 = LDX killed $x4, killed $x3
2602cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
2702cbdbdaSChen Zheng...
2802cbdbdaSChen Zheng---
2902cbdbdaSChen Zhengname: testIndexForm2
3002cbdbdaSChen Zheng#CHECK: name: testIndexForm2
3102cbdbdaSChen Zheng# ToBeDeletedReg equals to ToBeChangedReg
3202cbdbdaSChen ZhengtracksRegLiveness: true
3302cbdbdaSChen Zhengbody: |
3402cbdbdaSChen Zheng  bb.0.entry:
3502cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
3602cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
3782205914Sczhengsz    ; CHECK: $x3 = ADDI8 $x1, -76
3802cbdbdaSChen Zheng    $x3 = ADD8 killed $x3, killed $x4
3982205914Sczhengsz    ; CHECK-NOT: ADD8
4002cbdbdaSChen Zheng    $x6 = LD 4, killed $x3
4182205914Sczhengsz    ; CHECK: $x6 = LDX killed $x4, killed $x3
4202cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
4302cbdbdaSChen Zheng...
4402cbdbdaSChen Zheng---
4502cbdbdaSChen Zhengname: testIndexForm3
4602cbdbdaSChen Zheng#CHECK: name: testIndexForm3
4702cbdbdaSChen Zheng# There is other use for ToBeDeletedReg between ADD instr and Imm instr
4802cbdbdaSChen ZhengtracksRegLiveness: true
4902cbdbdaSChen Zhengbody: |
5002cbdbdaSChen Zheng  bb.0.entry:
5102cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
5202cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
5302cbdbdaSChen Zheng    ; CHECK: $x3 = ADDI8 $x1, -80
5402cbdbdaSChen Zheng    $x3 = ADD8 killed $x3, killed $x4
5502cbdbdaSChen Zheng    ; CHECK: $x3 = ADD8 killed $x3, killed $x4
5602cbdbdaSChen Zheng    STD $x3, killed $x6, 100
5702cbdbdaSChen Zheng    ; CHECK: STD $x3, killed $x6, 100
5802cbdbdaSChen Zheng    $x6 = LD 4, killed $x3
5902cbdbdaSChen Zheng    ; CHECK: $x6 = LD 4, killed $x3
6002cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
6102cbdbdaSChen Zheng...
6202cbdbdaSChen Zheng---
6302cbdbdaSChen Zhengname: testIndexForm4
64*68c6d7e1SSimon Pilgrim#CHECK: name: testIndexForm4
6502cbdbdaSChen Zheng# There is other use for ToBeChangedReg between ADDI instr and ADD instr
6602cbdbdaSChen ZhengtracksRegLiveness: true
6702cbdbdaSChen Zhengbody: |
6802cbdbdaSChen Zheng  bb.0.entry:
6902cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
7002cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
7102cbdbdaSChen Zheng    ; CHECK: $x3 = ADDI8 $x1, -80
7202cbdbdaSChen Zheng    STD $x3, killed $x6, 100
7302cbdbdaSChen Zheng    ; CHECK: STD $x3, killed $x6, 100
7402cbdbdaSChen Zheng    $x3 = ADD8 killed $x3, killed $x4
7502cbdbdaSChen Zheng    ; CHECK: $x3 = ADD8 killed $x3, killed $x4
7602cbdbdaSChen Zheng    $x6 = LD 4, killed $x3
7702cbdbdaSChen Zheng    ; CHECK: $x6 = LD 4, killed $x3
7802cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
7902cbdbdaSChen Zheng...
8002cbdbdaSChen Zheng---
8102cbdbdaSChen Zhengname: testIndexForm5
8202cbdbdaSChen Zheng#CHECK: name: testIndexForm5
8302cbdbdaSChen Zheng# ToBeChangedReg has no killed flag
8402cbdbdaSChen ZhengtracksRegLiveness: true
8502cbdbdaSChen Zhengbody: |
8602cbdbdaSChen Zheng  bb.0.entry:
8702cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
8802cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
8902cbdbdaSChen Zheng    ; CHECK: $x3 = ADDI8 $x1, -80
9002cbdbdaSChen Zheng    $x4 = ADD8 $x3, killed $x4
9102cbdbdaSChen Zheng    ; CHECK: $x4 = ADD8 $x3, killed $x4
9202cbdbdaSChen Zheng    STD killed $x3, killed $x6, 100
9302cbdbdaSChen Zheng    ; CHECK: STD killed $x3, killed $x6, 100
9402cbdbdaSChen Zheng    $x6 = LD 4, killed $x4
9502cbdbdaSChen Zheng    ; CHECK: $x6 = LD 4, killed $x4
9602cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
9702cbdbdaSChen Zheng...
9802cbdbdaSChen Zheng---
9902cbdbdaSChen Zhengname: testIndexForm6
10002cbdbdaSChen Zheng#CHECK: name: testIndexForm6
10102cbdbdaSChen Zheng# ToBeDeletedReg has no killed flag
10202cbdbdaSChen ZhengtracksRegLiveness: true
10302cbdbdaSChen Zhengbody: |
10402cbdbdaSChen Zheng  bb.0.entry:
10502cbdbdaSChen Zheng    liveins: $x3, $x1, $x4, $x6
10602cbdbdaSChen Zheng    $x3 = ADDI8 $x1, -80
10702cbdbdaSChen Zheng    ; CHECK: $x3 = ADDI8 $x1, -80
10802cbdbdaSChen Zheng    $x4 = ADD8 killed $x3, killed $x4
10902cbdbdaSChen Zheng    ; CHECK: $x4 = ADD8 killed $x3, killed $x4
11002cbdbdaSChen Zheng    $x6 = LD 4, $x4
11102cbdbdaSChen Zheng    ; CHECK: $x6 = LD 4, $x4
11202cbdbdaSChen Zheng    STD killed $x4, killed $x6, 100
11302cbdbdaSChen Zheng    BLR8 implicit $lr8, implicit $rm
11402cbdbdaSChen Zheng...
11582205914Sczhengsz---
11682205914Sczhengszname: testIndexForm7
11782205914Sczhengsz#CHECK: name: testIndexForm7
11882205914Sczhengsz# There is other def for ToBeChangedReg between ADD instr and Imm instr
11982205914SczhengsztracksRegLiveness: true
12082205914Sczhengszbody: |
12182205914Sczhengsz  bb.0.entry:
12282205914Sczhengsz    liveins: $x3, $x1, $x4, $x5, $x6
12382205914Sczhengsz    $x3 = ADDI8 $x1, -80
12482205914Sczhengsz    ; CHECK: $x3 = ADDI8 $x1, -80
12582205914Sczhengsz    $x4 = ADD8 killed $x3, killed $x5
12682205914Sczhengsz    ; CHECK: $x4 = ADD8 killed $x3, killed $x5
12782205914Sczhengsz    $x3 = LD 100, $x6
12882205914Sczhengsz    ; CHECK: $x3 = LD 100, $x6
12982205914Sczhengsz    STD killed $x3, killed $x6, 200
13082205914Sczhengsz    ; CHECK: STD killed $x3, killed $x6, 200
13182205914Sczhengsz    $x6 = LD 4, killed $x4
13282205914Sczhengsz    ; CHECK: $x6 = LD 4, killed $x4
13382205914Sczhengsz    BLR8 implicit $lr8, implicit $rm
13482205914Sczhengsz...
13582205914Sczhengsz---
13682205914Sczhengszname: testIndexForm8
13782205914Sczhengsz#CHECK: name: testIndexForm8
13882205914Sczhengsz# There is other def for ScaleReg between ADD instr and Imm instr
13982205914SczhengsztracksRegLiveness: true
14082205914Sczhengszbody: |
14182205914Sczhengsz  bb.0.entry:
14282205914Sczhengsz    liveins: $x3, $x1, $x4, $x5, $x6
14382205914Sczhengsz    $x3 = ADDI8 $x1, -80
14482205914Sczhengsz    ; CHECK: $x3 = ADDI8 $x1, -80
14582205914Sczhengsz    $x4 = ADD8 killed $x3, killed $x5
14682205914Sczhengsz    ; CHECK: $x4 = ADD8 killed $x3, killed $x5
14782205914Sczhengsz    $x5 = LD 100, $x6
14882205914Sczhengsz    ; CHECK: $x5 = LD 100, $x6
14982205914Sczhengsz    STD killed $x5, killed $x6, 200
15082205914Sczhengsz    ; CHECK: STD killed $x5, killed $x6, 200
15182205914Sczhengsz    $x6 = LD 4, killed $x4
15282205914Sczhengsz    ; CHECK: $x6 = LD 4, killed $x4
15382205914Sczhengsz    BLR8 implicit $lr8, implicit $rm
15482205914Sczhengsz...
1554eeb56d0SQingShan Zhang---
1564eeb56d0SQingShan Zhangname: testR0
157*68c6d7e1SSimon Pilgrim#CHECK: name: testR0
1584eeb56d0SQingShan Zhang# Give up the folding if the register is R0/X0
1594eeb56d0SQingShan ZhangtracksRegLiveness: true
1604eeb56d0SQingShan Zhangbody:             |
1614eeb56d0SQingShan Zhang  bb.0.entry:
1624eeb56d0SQingShan Zhang    liveins: $f1, $x0, $x3
1634eeb56d0SQingShan Zhang    $x4 = ADDI8 killed $x3, -8
1644eeb56d0SQingShan Zhang    $x4 = ADD8 killed $x4, $x0
1654eeb56d0SQingShan Zhang    STFD killed $f1, -8, killed $x4
1664eeb56d0SQingShan Zhang    ; CHECK-NOT: STFDX
1674eeb56d0SQingShan Zhang    BLR8 implicit $lr8, implicit $rm
1684eeb56d0SQingShan Zhang...
169