diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -1541,6 +1541,11 @@ if (Cond[1].getReg() == PPC::CTR || Cond[1].getReg() == PPC::CTR8) return false; + // If the condition branch uses a physical register, then it cannot be turned + // into a select. + if (Register::isPhysicalRegister(Cond[1].getReg())) + return false; + // Check register classes. const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo(); const TargetRegisterClass *RC = diff --git a/llvm/test/CodeGen/PowerPC/ifcvt_cr_field.ll b/llvm/test/CodeGen/PowerPC/ifcvt_cr_field.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/ifcvt_cr_field.ll @@ -0,0 +1,64 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -verify-machineinstrs | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-aix -mcpu=pwr7 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-AIX-64 +; RUN: llc < %s -mtriple=powerpc-unknown-aix -mcpu=pwr7 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-AIX-32 + +define dso_local signext i32 @test(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) local_unnamed_addr { +; CHECK-LABEL: test: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vcmpgtsw. 2, 2, 3 +; CHECK-NEXT: bge 6, .LBB0_2 +; CHECK-NEXT: # %bb.1: # %land.rhs +; CHECK-NEXT: vcmpgtsw. 2, 4, 3 +; CHECK-NEXT: mfocrf 3, 2 +; CHECK-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-NEXT: clrldi 3, 3, 32 +; CHECK-NEXT: blr +; CHECK-NEXT: .LBB0_2: +; CHECK-NEXT: li 3, 0 +; CHECK-NEXT: blr +; +; CHECK-AIX-64-LABEL: test: +; CHECK-AIX-64: # %bb.0: # %entry +; CHECK-AIX-64-NEXT: vcmpgtsw. 2, 2, 3 +; CHECK-AIX-64-NEXT: bge 6, L..BB0_2 +; CHECK-AIX-64-NEXT: # %bb.1: # %land.rhs +; CHECK-AIX-64-NEXT: vcmpgtsw. 2, 4, 3 +; CHECK-AIX-64-NEXT: mfocrf 3, 2 +; CHECK-AIX-64-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-AIX-64-NEXT: clrldi 3, 3, 32 +; CHECK-AIX-64-NEXT: blr +; CHECK-AIX-64-NEXT: L..BB0_2: +; CHECK-AIX-64-NEXT: li 3, 0 +; CHECK-AIX-64-NEXT: blr +; +; CHECK-AIX-32-LABEL: test: +; CHECK-AIX-32: # %bb.0: # %entry +; CHECK-AIX-32-NEXT: vcmpgtsw. 2, 2, 3 +; CHECK-AIX-32-NEXT: bge 6, L..BB0_2 +; CHECK-AIX-32-NEXT: # %bb.1: # %land.rhs +; CHECK-AIX-32-NEXT: vcmpgtsw. 2, 4, 3 +; CHECK-AIX-32-NEXT: mfocrf 3, 2 +; CHECK-AIX-32-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-AIX-32-NEXT: blr +; CHECK-AIX-32-NEXT: L..BB0_2: +; CHECK-AIX-32-NEXT: li 3, 0 +; CHECK-AIX-32-NEXT: blr +entry: + %0 = tail call i32 @llvm.ppc.altivec.vcmpgtsw.p(i32 2, <4 x i32> %a, <4 x i32> %b) + %tobool.not = icmp eq i32 %0, 0 + br i1 %tobool.not, label %land.end, label %land.rhs + +land.rhs: ; preds = %entry + %1 = tail call i32 @llvm.ppc.altivec.vcmpgtsw.p(i32 2, <4 x i32> %c, <4 x i32> %b) + %tobool1 = icmp ne i32 %1, 0 + %phi.cast = zext i1 %tobool1 to i32 + br label %land.end + +land.end: ; preds = %land.rhs, %entry + %2 = phi i32 [ 0, %entry ], [ %phi.cast, %land.rhs ] + ret i32 %2 +} + +declare i32 @llvm.ppc.altivec.vcmpgtsw.p(i32, <4 x i32>, <4 x i32>)