From: Matt Arsenault Date: Thu, 28 Feb 2019 00:52:36 +0000 (+0000) Subject: AMDGPU/GlobalISel: Add regbankselect test for phis X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=62a80b42c15040a5adf5b6d918501f910abeac62;p=llvm AMDGPU/GlobalISel: Add regbankselect test for phis Add baseline for future fixes. These mostly show how this is broken and producing illegal situations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355057 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/CodeGen/AMDGPU/GlobalISel/regbankselect-phi.mir b/test/CodeGen/AMDGPU/GlobalISel/regbankselect-phi.mir new file mode 100644 index 00000000000..c165a79f063 --- /dev/null +++ b/test/CodeGen/AMDGPU/GlobalISel/regbankselect-phi.mir @@ -0,0 +1,1434 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s + +--- +name: phi_s32_ss_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_ss_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_sv_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_sv_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $vgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $vgpr0, $sgpr1 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_vs_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_vs_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_vv_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_vv_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $sgpr0 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $sgpr0 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $sgpr0 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... +--- +name: phi_s32_ss_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_ss_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $vgpr0 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $vgpr0 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $vgpr0 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_sv_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_sv_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $vgpr0, $vgpr1 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $vgpr0, $vgpr1 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $vgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_vs_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_vs_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $vgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $vgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $vgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s32_vv_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_vv_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s32) = G_PHI [[COPY]](s32), %bb.0, [[COPY3]](s32), %bb.1 + ; CHECK: $sgpr0 = COPY [[PHI]](s32) + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31 + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $vgpr2 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $vgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %4, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %5:_(s32) = COPY %1 + G_BR %bb.2 + + bb.2: + %6:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + $sgpr0 = COPY %6 + S_SETPC_B64 undef $sgpr30_sgpr31 + +... + +--- +name: phi_s1_scc_scc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_scc_scc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP2:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:scc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1 + ; CHECK: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[PHI]](s1), [[C]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_scc_scc_scc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_scc_scc_scc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.3(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY $sgpr3 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY3]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[COPY3]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.3 + ; CHECK: G_BR %bb.1 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x40000000), %bb.3(0x40000000) + ; CHECK: [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 99 + ; CHECK: [[C2:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 888 + ; CHECK: [[ICMP2:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C1]] + ; CHECK: [[ICMP3:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C2]] + ; CHECK: G_BRCOND [[ICMP3]](s1), %bb.3 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: successors: %bb.3(0x80000000) + ; CHECK: [[C3:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 123 + ; CHECK: [[ICMP4:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C3]] + ; CHECK: G_BR %bb.3 + ; CHECK: bb.3: + ; CHECK: [[PHI:%[0-9]+]]:scc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1, [[ICMP4]](s1), %bb.2 + ; CHECK: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[PHI]](s1), [[COPY]], [[COPY1]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.3 + liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = COPY $sgpr3 + %4:_(s32) = G_CONSTANT i32 0 + %5:_(s1) = G_ICMP intpred(eq), %0, %3 + %6:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %6, %bb.3 + G_BR %bb.1 + + bb.1: + successors: %bb.2, %bb.3 + + %7:_(s32) = G_CONSTANT i32 99 + %8:_(s32) = G_CONSTANT i32 888 + %9:_(s1) = G_ICMP intpred(eq), %1, %7 + %10:_(s1) = G_ICMP intpred(eq), %1, %8 + G_BRCOND %10, %bb.3 + G_BR %bb.2 + + bb.2: + successors: %bb.3 + + %11:_(s32) = G_CONSTANT i32 123 + %12:_(s1) = G_ICMP intpred(eq), %2, %11 + G_BR %bb.3 + + bb.3: + %13:_(s1) = G_PHI %5, %bb.0, %9, %bb.1, %12, %bb.2 + %14:_(s32) = G_SELECT %13, %0, %1 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %14 + +... + +--- +name: phi_s1_scc_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_scc_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $vgpr0 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP2:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:scc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1 + ; CHECK: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[PHI]](s1), [[C]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $vgpr0 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_vcc_scc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_vcc_scc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP2:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vcc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[PHI]](s1), [[COPY3]], [[COPY4]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %1 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_vcc_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_vcc_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $sgpr0 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP2:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vcc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[PHI]](s1), [[COPY3]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $sgpr0 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $sgpr0 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_s_scc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_s_scc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[ICMP1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY5]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_scc_s_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_scc_s_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:scc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[TRUNC]](s1), %bb.1 + ; CHECK: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[PHI]](s1), [[C]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_scc_v_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_scc_v_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:scc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[TRUNC]](s1), %bb.1 + ; CHECK: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[PHI]](s1), [[C]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_v_scc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_v_scc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[ICMP1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + + + + + +--- +name: phi_s1_vcc_s_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_vcc_s_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vcc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[TRUNC]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[PHI]](s1), [[COPY3]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_s_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_s_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[ICMP1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY5]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_vcc_v_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_vcc_v_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $sgpr0 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]] + ; CHECK: [[ICMP1:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP1]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vcc(s1) = G_PHI [[ICMP]](s1), %bb.0, [[TRUNC]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[PHI]](s1), [[COPY3]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $sgpr0 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $sgpr0 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_ICMP intpred(eq), %0, %3 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_v_vcc_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_v_vcc_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $sgpr0 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[ICMP1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $sgpr0 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_v_s_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_v_s_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[TRUNC1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $sgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_s_v_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_s_v_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $sgpr0, $sgpr1 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC1:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[TRUNC1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY5]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $sgpr0, $sgpr1 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $vgpr0 + %2:_(s32) = COPY $sgpr1 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_v_v_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_v_v_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $vgpr0, $vgpr1, $sgpr0 + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC1:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:vgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[TRUNC1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $vgpr0, $vgpr1, $sgpr0 + + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s32) = COPY $sgpr0 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +--- +name: phi_s1_s_s_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s1_s_s_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.1: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32) + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s1) = G_PHI [[TRUNC]](s1), %bb.0, [[TRUNC1]](s1), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[PHI]](s1) + ; CHECK: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32) + ; CHECK: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) + ; CHECK: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY3]](s1), [[COPY4]], [[COPY5]] + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[SELECT]](s32) + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + %4:_(s1) = G_TRUNC %0 + %5:_(s1) = G_ICMP intpred(eq), %2, %3 + G_BRCOND %5, %bb.1 + G_BR %bb.2 + + bb.1: + successors: %bb.2 + + %6:_(s1) = G_TRUNC %1 + G_BR %bb.2 + + bb.2: + %7:_(s1) = G_PHI %4, %bb.0, %6, %bb.1 + %8:_(s32) = G_SELECT %7, %3, %0 + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %8 + +... + +# Test a phi where the VGPR input is after the phi itself +--- +name: phi_s32_s_loop_v_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_s_loop_v_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $vgpr0 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: G_BR %bb.1 + ; CHECK: bb.1: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, %5(s32), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[COPY2]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[PHI]](s32) + bb.0: + successors: %bb.1 + liveins: $sgpr0, $sgpr1, $vgpr0 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $vgpr0 + %3:_(s32) = G_CONSTANT i32 0 + G_BR %bb.1 + + bb.1: + successors: %bb.1, %bb.2 + + %4:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + %5:_(s32) = COPY %2 + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BRCOND %6, %bb.1 + G_BR %bb.2 + + bb.2: + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %4 + +... + +# Test a phi where an SGPR input is after the phi itself +--- +name: phi_s32_s_loop_s_sbranch +legalized: true +tracksRegLiveness: true + +body: | + ; CHECK-LABEL: name: phi_s32_s_loop_s_sbranch + ; CHECK: bb.0: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2 + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2 + ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0 + ; CHECK: G_BR %bb.1 + ; CHECK: bb.1: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI [[COPY]](s32), %bb.0, %5(s32), %bb.1 + ; CHECK: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY [[COPY2]](s32) + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: G_BR %bb.2 + ; CHECK: bb.2: + ; CHECK: S_SETPC_B64 undef $sgpr30_sgpr31, implicit [[PHI]](s32) + bb.0: + successors: %bb.1 + liveins: $sgpr0, $sgpr1, $sgpr2 + + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s32) = COPY $sgpr2 + %3:_(s32) = G_CONSTANT i32 0 + G_BR %bb.1 + + bb.1: + successors: %bb.1, %bb.2 + + %4:_(s32) = G_PHI %0, %bb.0, %5, %bb.1 + %5:_(s32) = COPY %2 + %6:_(s1) = G_ICMP intpred(eq), %1, %3 + G_BRCOND %6, %bb.1 + G_BR %bb.2 + + bb.2: + S_SETPC_B64 undef $sgpr30_sgpr31, implicit %4 + +...