[PATCH] D21151: AMDGPU: Preserve undef flag on vcc when shrinking v_cndmask_b32
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 8 14:36:53 PDT 2016
arsenm updated this revision to Diff 60104.
arsenm added a comment.
Go back to preserving kill
http://reviews.llvm.org/D21151
Files:
lib/Target/AMDGPU/SIShrinkInstructions.cpp
test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll
Index: test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll
===================================================================
--- test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll
+++ test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll
@@ -25,29 +25,3 @@
bb2:
ret void
}
-
-; The undef flag on the condition src must be preserved on the
-; implicit vcc use to avoid verifier errors.
-
-; GCN-LABEL: {{^}}preserve_condition_undef_flag:
-; GCN-NOT: vcc
-; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, 1.0, v{{[0-9]+}}, vcc
-; GCN: v_cndmask_b32_e64 v1, 0, 1, s{{\[[0-9]+:[0-9]+\]}}
-define void @preserve_condition_undef_flag(float %arg, i32 %arg1, float %arg2) {
-bb0:
- %tmp = icmp sgt i32 %arg1, 4
- %tmp4 = select i1 undef, float %arg, float 1.000000e+00
- %tmp5 = fcmp ogt float %arg2, 0.000000e+00
- %tmp6 = fcmp olt float %arg2, 1.000000e+00
- %tmp7 = fcmp olt float %arg, %tmp4
- %tmp8 = and i1 %tmp5, %tmp6
- %tmp9 = and i1 %tmp8, %tmp7
- br i1 %tmp9, label %bb1, label %bb2
-
-bb1:
- store volatile i32 0, i32 addrspace(1)* undef
- br label %bb2
-
-bb2:
- ret void
-}
Index: lib/Target/AMDGPU/SIShrinkInstructions.cpp
===================================================================
--- lib/Target/AMDGPU/SIShrinkInstructions.cpp
+++ lib/Target/AMDGPU/SIShrinkInstructions.cpp
@@ -184,16 +184,18 @@
}
// Copy MachineOperand with all flags except setting it as implicit.
-static void copyFlagsToImplicitVCC(MachineInstr &MI,
- const MachineOperand &Orig) {
-
- for (MachineOperand &Use : MI.implicit_operands()) {
- if (Use.getReg() == AMDGPU::VCC) {
- Use.setIsUndef(Orig.isUndef());
- Use.setIsKill(Orig.isKill());
- return;
- }
- }
+static MachineOperand copyRegOperandAsImplicit(const MachineOperand &Orig) {
+ assert(!Orig.isImplicit());
+ return MachineOperand::CreateReg(Orig.getReg(),
+ Orig.isDef(),
+ true,
+ Orig.isKill(),
+ Orig.isDead(),
+ Orig.isUndef(),
+ Orig.isEarlyClobber(),
+ Orig.getSubReg(),
+ Orig.isDebug(),
+ Orig.isInternalRead());
}
static bool isKImmOperand(const SIInstrInfo *TII, const MachineOperand &Src) {
@@ -396,9 +398,10 @@
Inst32.addOperand(*Src2);
} else {
// In the case of V_CNDMASK_B32_e32, the explicit operand src2 is
- // replaced with an implicit read of vcc. This was already added
- // during the initial BuildMI, so find it to preserve the flags.
- copyFlagsToImplicitVCC(*Inst32, *Src2);
+ // replaced with an implicit read of vcc.
+ assert(Src2->getReg() == AMDGPU::VCC &&
+ "Unexpected missing register operand");
+ Inst32.addOperand(copyRegOperandAsImplicit(*Src2));
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21151.60104.patch
Type: text/x-patch
Size: 3005 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160608/137592ee/attachment.bin>
More information about the llvm-commits
mailing list