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, -76
22    $x4 = ADD8 killed $x3, killed $x4
23    ; CHECK-NOT: ADD8
24    $x6 = LD 4, killed $x4
25    ; CHECK: $x6 = LDX killed $x4, killed $x3
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, -76
38    $x3 = ADD8 killed $x3, killed $x4
39    ; CHECK-NOT: ADD8
40    $x6 = LD 4, killed $x3
41    ; CHECK: $x6 = LDX killed $x4, 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---
116name: testIndexForm7
117#CHECK : name : testIndexForm7
118# There is other def for ToBeChangedReg between ADD instr and Imm instr
119tracksRegLiveness: true
120body: |
121  bb.0.entry:
122    liveins: $x3, $x1, $x4, $x5, $x6
123    $x3 = ADDI8 $x1, -80
124    ; CHECK: $x3 = ADDI8 $x1, -80
125    $x4 = ADD8 killed $x3, killed $x5
126    ; CHECK: $x4 = ADD8 killed $x3, killed $x5
127    $x3 = LD 100, $x6
128    ; CHECK: $x3 = LD 100, $x6
129    STD killed $x3, killed $x6, 200
130    ; CHECK: STD killed $x3, killed $x6, 200
131    $x6 = LD 4, killed $x4
132    ; CHECK: $x6 = LD 4, killed $x4
133    BLR8 implicit $lr8, implicit $rm
134...
135---
136name: testIndexForm8
137#CHECK : name : testIndexForm8
138# There is other def for ScaleReg between ADD instr and Imm instr
139tracksRegLiveness: true
140body: |
141  bb.0.entry:
142    liveins: $x3, $x1, $x4, $x5, $x6
143    $x3 = ADDI8 $x1, -80
144    ; CHECK: $x3 = ADDI8 $x1, -80
145    $x4 = ADD8 killed $x3, killed $x5
146    ; CHECK: $x4 = ADD8 killed $x3, killed $x5
147    $x5 = LD 100, $x6
148    ; CHECK: $x5 = LD 100, $x6
149    STD killed $x5, killed $x6, 200
150    ; CHECK: STD killed $x5, killed $x6, 200
151    $x6 = LD 4, killed $x4
152    ; CHECK: $x6 = LD 4, killed $x4
153    BLR8 implicit $lr8, implicit $rm
154...
155