From 848d9223c510e6ecb12976e01f9b7e8012308703 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 14 Nov 2014 18:43:41 +0000 Subject: [PATCH] R600/SI: Fix verifier error from a branch on IMPLICIT_DEF SIILowerI1Copies wasn't correctly handling this case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222020 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/R600/SILowerI1Copies.cpp | 8 ++++++++ test/CodeGen/R600/i1-copy-implicit-def.ll | 21 +++++++++++++++++++++ test/CodeGen/R600/v-cmp-vreg1-src-error.ll | 22 ---------------------- 3 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 test/CodeGen/R600/i1-copy-implicit-def.ll delete mode 100644 test/CodeGen/R600/v-cmp-vreg1-src-error.ll diff --git a/lib/Target/R600/SILowerI1Copies.cpp b/lib/Target/R600/SILowerI1Copies.cpp index 9d792961117..65b892cf122 100644 --- a/lib/Target/R600/SILowerI1Copies.cpp +++ b/lib/Target/R600/SILowerI1Copies.cpp @@ -109,6 +109,14 @@ bool SILowerI1Copies::runOnMachineFunction(MachineFunction &MF) { continue; } + if (MI.getOpcode() == AMDGPU::IMPLICIT_DEF) { + unsigned Reg = MI.getOperand(0).getReg(); + const TargetRegisterClass *RC = MRI.getRegClass(Reg); + if (RC == &AMDGPU::VReg_1RegClass) + MRI.setRegClass(Reg, &AMDGPU::SReg_64RegClass); + continue; + } + if (MI.getOpcode() != AMDGPU::COPY || !TargetRegisterInfo::isVirtualRegister(MI.getOperand(0).getReg()) || !TargetRegisterInfo::isVirtualRegister(MI.getOperand(1).getReg())) diff --git a/test/CodeGen/R600/i1-copy-implicit-def.ll b/test/CodeGen/R600/i1-copy-implicit-def.ll new file mode 100644 index 00000000000..4af3879ad62 --- /dev/null +++ b/test/CodeGen/R600/i1-copy-implicit-def.ll @@ -0,0 +1,21 @@ +; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s + +; SILowerI1Copies was not handling IMPLICIT_DEF +; SI-LABEL: @br_implicit_def +; SI: BB#0: +; SI-NEXT: s_and_saveexec_b64 +; SI-NEXT: s_xor_b64 +; SI-NEXT: BB#1: +define void @br_implicit_def(i32 addrspace(1)* %out, i32 %arg) #0 { +bb: + br i1 undef, label %bb1, label %bb2 + +bb1: + store volatile i32 123, i32 addrspace(1)* %out + ret void + +bb2: + ret void +} + +attributes #0 = { nounwind } diff --git a/test/CodeGen/R600/v-cmp-vreg1-src-error.ll b/test/CodeGen/R600/v-cmp-vreg1-src-error.ll deleted file mode 100644 index 3892c9bad34..00000000000 --- a/test/CodeGen/R600/v-cmp-vreg1-src-error.ll +++ /dev/null @@ -1,22 +0,0 @@ -; XFAIL: * -; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s - -define void @init_data_cost_reduce_0(i32 %arg) #0 { -bb: - br i1 undef, label %bb1, label %bb2 - -bb1: ; preds = %bb - br label %bb2 - -bb2: ; preds = %bb1, %bb - br i1 undef, label %bb3, label %bb4 - -bb3: ; preds = %bb2 - %tmp = mul i32 undef, %arg - br label %bb4 - -bb4: ; preds = %bb3, %bb2 - unreachable -} - -attributes #0 = { nounwind }