# RUN: llc -mtriple=powerpc64le--linux-gnu -stop-after ppc-pre-emit-peephole %s -o - -verify-machineinstrs | FileCheck %s # ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, OffsetAddi # ADD instr: ToBeDeletedReg = ADD ToBeChangedReg(killed), ScaleReg # Imm instr: Reg = op OffsetImm, ToBeDeletedReg(killed) # # can be folded to: # # new ADDI instr: ToBeChangedReg = ADDI FrameBaseReg, (OffsetAddi + OffsetImm) # Index instr: Reg = opx ScaleReg, ToBeChangedReg(killed) --- name: testIndexForm1 #CHECK: name: testIndexForm1 # ToBeDeletedReg equals to ScaleReg tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -76 $x4 = ADD8 killed $x3, killed $x4 ; CHECK-NOT: ADD8 $x6 = LD 4, killed $x4 ; CHECK: $x6 = LDX killed $x4, killed $x3 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm2 #CHECK: name: testIndexForm2 # ToBeDeletedReg equals to ToBeChangedReg tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -76 $x3 = ADD8 killed $x3, killed $x4 ; CHECK-NOT: ADD8 $x6 = LD 4, killed $x3 ; CHECK: $x6 = LDX killed $x4, killed $x3 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm3 #CHECK: name: testIndexForm3 # There is other use for ToBeDeletedReg between ADD instr and Imm instr tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 $x3 = ADD8 killed $x3, killed $x4 ; CHECK: $x3 = ADD8 killed $x3, killed $x4 STD $x3, killed $x6, 100 ; CHECK: STD $x3, killed $x6, 100 $x6 = LD 4, killed $x3 ; CHECK: $x6 = LD 4, killed $x3 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm4 #CHECK: name: testIndexForm4 # There is other use for ToBeChangedReg between ADDI instr and ADD instr tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 STD $x3, killed $x6, 100 ; CHECK: STD $x3, killed $x6, 100 $x3 = ADD8 killed $x3, killed $x4 ; CHECK: $x3 = ADD8 killed $x3, killed $x4 $x6 = LD 4, killed $x3 ; CHECK: $x6 = LD 4, killed $x3 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm5 #CHECK: name: testIndexForm5 # ToBeChangedReg has no killed flag tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 $x4 = ADD8 $x3, killed $x4 ; CHECK: $x4 = ADD8 $x3, killed $x4 STD killed $x3, killed $x6, 100 ; CHECK: STD killed $x3, killed $x6, 100 $x6 = LD 4, killed $x4 ; CHECK: $x6 = LD 4, killed $x4 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm6 #CHECK: name: testIndexForm6 # ToBeDeletedReg has no killed flag tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 $x4 = ADD8 killed $x3, killed $x4 ; CHECK: $x4 = ADD8 killed $x3, killed $x4 $x6 = LD 4, $x4 ; CHECK: $x6 = LD 4, $x4 STD killed $x4, killed $x6, 100 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm7 #CHECK: name: testIndexForm7 # There is other def for ToBeChangedReg between ADD instr and Imm instr tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x5, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 $x4 = ADD8 killed $x3, killed $x5 ; CHECK: $x4 = ADD8 killed $x3, killed $x5 $x3 = LD 100, $x6 ; CHECK: $x3 = LD 100, $x6 STD killed $x3, killed $x6, 200 ; CHECK: STD killed $x3, killed $x6, 200 $x6 = LD 4, killed $x4 ; CHECK: $x6 = LD 4, killed $x4 BLR8 implicit $lr8, implicit $rm ... --- name: testIndexForm8 #CHECK: name: testIndexForm8 # There is other def for ScaleReg between ADD instr and Imm instr tracksRegLiveness: true body: | bb.0.entry: liveins: $x3, $x1, $x4, $x5, $x6 $x3 = ADDI8 $x1, -80 ; CHECK: $x3 = ADDI8 $x1, -80 $x4 = ADD8 killed $x3, killed $x5 ; CHECK: $x4 = ADD8 killed $x3, killed $x5 $x5 = LD 100, $x6 ; CHECK: $x5 = LD 100, $x6 STD killed $x5, killed $x6, 200 ; CHECK: STD killed $x5, killed $x6, 200 $x6 = LD 4, killed $x4 ; CHECK: $x6 = LD 4, killed $x4 BLR8 implicit $lr8, implicit $rm ... --- name: testR0 #CHECK: name: testR0 # Give up the folding if the register is R0/X0 tracksRegLiveness: true body: | bb.0.entry: liveins: $f1, $x0, $x3 $x4 = ADDI8 killed $x3, -8 $x4 = ADD8 killed $x4, $x0 STFD killed $f1, -8, killed $x4 ; CHECK-NOT: STFDX BLR8 implicit $lr8, implicit $rm ...