1# RUN: llc -mtriple=powerpc64le--linux-gnu -stop-after ppc-pre-emit-peephole %s -o - -verify-machineinstrs | FileCheck %s
2
3# ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, OffsetAddi
4# ADD instr:  ToBeDeletedReg = ADD ToBeChangedReg(killed), ScaleReg
5# Imm instr:  Reg            = op OffsetImm, ToBeDeletedReg(killed)
6#
7# can be folded to:
8#
9# new ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, (OffsetAddi + OffsetImm)
10# Index instr:    Reg            = opx ScaleReg, ToBeChangedReg(killed)
11
12---
13name: testIndexForm1
14#CHECK : name : testIndexForm1
15# ToBeDeletedReg equals to ScaleReg
16tracksRegLiveness: true
17body: |
18  bb.0.entry:
19    liveins: $x3, $x1, $x4, $x6
20    $x3 = ADDI8 $x1, -80
21    ; CHECK: $x3 = ADDI8 $x1, -80
22    $x4 = ADD8 killed $x3, killed $x4
23    ; CHECK: $x4 = ADD8 killed $x3, killed $x4
24    $x6 = LD 4, killed $x4
25    ; CHECK: $x6 = LD 4, killed $x4
26    BLR8 implicit $lr8, implicit $rm
27...
28---
29name: testIndexForm2
30#CHECK : name : testIndexForm2
31# ToBeDeletedReg equals to ToBeChangedReg
32tracksRegLiveness: true
33body: |
34  bb.0.entry:
35    liveins: $x3, $x1, $x4, $x6
36    $x3 = ADDI8 $x1, -80
37    ; CHECK: $x3 = ADDI8 $x1, -80
38    $x3 = ADD8 killed $x3, killed $x4
39    ; CHECK: $x3 = ADD8 killed $x3, killed $x4
40    $x6 = LD 4, killed $x3
41    ; CHECK: $x6 = LD 4, killed $x3
42    BLR8 implicit $lr8, implicit $rm
43...
44---
45name: testIndexForm3
46#CHECK : name : testIndexForm3
47# There is other use for ToBeDeletedReg between ADD instr and Imm instr
48tracksRegLiveness: true
49body: |
50  bb.0.entry:
51    liveins: $x3, $x1, $x4, $x6
52    $x3 = ADDI8 $x1, -80
53    ; CHECK: $x3 = ADDI8 $x1, -80
54    $x3 = ADD8 killed $x3, killed $x4
55    ; CHECK: $x3 = ADD8 killed $x3, killed $x4
56    STD $x3, killed $x6, 100
57    ; CHECK: STD $x3, killed $x6, 100
58    $x6 = LD 4, killed $x3
59    ; CHECK: $x6 = LD 4, killed $x3
60    BLR8 implicit $lr8, implicit $rm
61...
62---
63name: testIndexForm4
64#CHECK : name : testIndexForm3
65# There is other use for ToBeChangedReg between ADDI instr and ADD instr
66tracksRegLiveness: true
67body: |
68  bb.0.entry:
69    liveins: $x3, $x1, $x4, $x6
70    $x3 = ADDI8 $x1, -80
71    ; CHECK: $x3 = ADDI8 $x1, -80
72    STD $x3, killed $x6, 100
73    ; CHECK: STD $x3, killed $x6, 100
74    $x3 = ADD8 killed $x3, killed $x4
75    ; CHECK: $x3 = ADD8 killed $x3, killed $x4
76    $x6 = LD 4, killed $x3
77    ; CHECK: $x6 = LD 4, killed $x3
78    BLR8 implicit $lr8, implicit $rm
79...
80---
81name: testIndexForm5
82#CHECK : name : testIndexForm5
83# ToBeChangedReg has no killed flag
84tracksRegLiveness: true
85body: |
86  bb.0.entry:
87    liveins: $x3, $x1, $x4, $x6
88    $x3 = ADDI8 $x1, -80
89    ; CHECK: $x3 = ADDI8 $x1, -80
90    $x4 = ADD8 $x3, killed $x4
91    ; CHECK: $x4 = ADD8 $x3, killed $x4
92    STD killed $x3, killed $x6, 100
93    ; CHECK: STD killed $x3, killed $x6, 100
94    $x6 = LD 4, killed $x4
95    ; CHECK: $x6 = LD 4, killed $x4
96    BLR8 implicit $lr8, implicit $rm
97...
98---
99name: testIndexForm6
100#CHECK : name : testIndexForm6
101# ToBeDeletedReg has no killed flag
102tracksRegLiveness: true
103body: |
104  bb.0.entry:
105    liveins: $x3, $x1, $x4, $x6
106    $x3 = ADDI8 $x1, -80
107    ; CHECK: $x3 = ADDI8 $x1, -80
108    $x4 = ADD8 killed $x3, killed $x4
109    ; CHECK: $x4 = ADD8 killed $x3, killed $x4
110    $x6 = LD 4, $x4
111    ; CHECK: $x6 = LD 4, $x4
112    STD killed $x4, killed $x6, 100
113    BLR8 implicit $lr8, implicit $rm
114...
115