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