| # RUN: llc -run-pass opt-phis -mtriple=x86_64-- -o - %s | FileCheck %s | |
| # RUN: llc -passes opt-phis -mtriple=x86_64-- -o - %s | FileCheck %s | |
| # All PHIs should be removed since they can be securely replaced | |
| # by %8 register. | |
| # CHECK-NOT: PHI | |
| --- | | |
| define void @test() { | |
| ret void | |
| } | |
| ... | |
| --- | |
| name: test | |
| alignment: 16 | |
| tracksRegLiveness: true | |
| jumpTable: | |
| kind: block-address | |
| entries: | |
| - id: 0 | |
| blocks: [ '%bb.3', '%bb.2', '%bb.1', '%bb.4' ] | |
| body: | | |
| bb.0: | |
| liveins: $edi, $ymm0, $rsi | |
| %9:gr64 = COPY $rsi | |
| %8:vr256 = COPY $ymm0 | |
| %7:gr32 = COPY $edi | |
| %11:gr32 = SAR32ri %7, 31, implicit-def dead $eflags | |
| %12:gr32 = SHR32ri %11, 30, implicit-def dead $eflags | |
| %13:gr32 = ADD32rr %7, killed %12, implicit-def dead $eflags | |
| %14:gr32 = AND32ri8 %13, -4, implicit-def dead $eflags | |
| %15:gr32 = SUB32rr %7, %14, implicit-def dead $eflags | |
| %10:gr64_nosp = SUBREG_TO_REG %15, %subreg.sub_32bit | |
| %16:gr32 = SUB32ri8 %15, 3, implicit-def $eflags | |
| JCC_1 %bb.8, 7, implicit $eflags | |
| bb.9: | |
| JMP64m $noreg, 8, %10, %jump-table.0, $noreg :: (load (s64) from jump-table) | |
| bb.1: | |
| %0:vr256 = COPY %8 | |
| JMP_1 %bb.5 | |
| bb.2: | |
| %1:vr256 = COPY %8 | |
| JMP_1 %bb.6 | |
| bb.3: | |
| %2:vr256 = COPY %8 | |
| JMP_1 %bb.7 | |
| bb.4: | |
| %3:vr256 = COPY %8 | |
| %17:vr128 = VEXTRACTF128rri %8, 1 | |
| VPEXTRDmri %9, 1, $noreg, 12, $noreg, killed %17, 2 | |
| bb.5: | |
| %4:vr256 = PHI %0, %bb.1, %3, %bb.4 | |
| %18:vr128 = VEXTRACTF128rri %4, 1 | |
| VPEXTRDmri %9, 1, $noreg, 8, $noreg, killed %18, 1 | |
| bb.6: | |
| %5:vr256 = PHI %1, %bb.2, %4, %bb.5 | |
| %19:vr128 = VEXTRACTF128rri %5, 1 | |
| VMOVPDI2DImr %9, 1, $noreg, 4, $noreg, killed %19 | |
| bb.7: | |
| %6:vr256 = PHI %2, %bb.3, %5, %bb.6 | |
| %20:vr128 = COPY %6.sub_xmm | |
| VPEXTRDmri %9, 1, $noreg, 0, $noreg, killed %20, 3 | |
| bb.8: | |
| RET 0 | |
| ... |