[PATCH] Fix for PR23103. Correctly propagate the 'IsUndef' flag to the register operands of a commuted instruction.
Andrea Di Biagio
Andrea_DiBiagio at sn.scee.net
Thu Apr 30 11:23:07 PDT 2015
Hi qcolombet,
Revision 220239 exposed a latent bug in method 'TargetInstrInfo::commuteInstruction'.
When commuting the operands of a machine instruction, method 'commuteInstruction' doesn't correctly propagate the 'IsUndef' flag to the register operands of the new (commuted) instruction.
Before this patch, the following instruction:
%vreg4<def> = VADDSDrr %vreg14, %vreg5<undef>; FR64:%vreg4,%vreg14,%vreg5
was wrongly converted by method 'commuteInstruction' into:
%vreg4<def> = VADDSDrr %vreg5, %vreg14<undef>; FR64:%vreg4,%vreg5,%vreg14
The correct instruction should have been:
%vreg4<def> = VADDSDrr %vreg5<undef>, %vreg14; FR64:%vreg4,%vreg5,%vreg14
This patch fixes the problem in method 'TargetInstrInfo::commuteInstruction'. When swapping the operands of a machine instruction, we now make sure that 'IsUndef' flags are correctly set.
This fixes PR23103.
Added test case 'pr23103.ll' (obtained from the reproducible posted in PR23103).
Please let me know if ok to submit.
Thanks,
Andrea
http://reviews.llvm.org/D9406
Files:
lib/CodeGen/TargetInstrInfo.cpp
test/CodeGen/X86/pr23103.ll
Index: lib/CodeGen/TargetInstrInfo.cpp
===================================================================
--- lib/CodeGen/TargetInstrInfo.cpp
+++ lib/CodeGen/TargetInstrInfo.cpp
@@ -142,6 +142,8 @@
unsigned SubReg2 = MI->getOperand(Idx2).getSubReg();
bool Reg1IsKill = MI->getOperand(Idx1).isKill();
bool Reg2IsKill = MI->getOperand(Idx2).isKill();
+ bool Reg1IsUndef = MI->getOperand(Idx1).isUndef();
+ bool Reg2IsUndef = MI->getOperand(Idx2).isUndef();
// If destination is tied to either of the commuted source register, then
// it must be updated.
if (HasDef && Reg0 == Reg1 &&
@@ -172,6 +174,8 @@
MI->getOperand(Idx1).setSubReg(SubReg2);
MI->getOperand(Idx2).setIsKill(Reg1IsKill);
MI->getOperand(Idx1).setIsKill(Reg2IsKill);
+ MI->getOperand(Idx2).setIsUndef(Reg1IsUndef);
+ MI->getOperand(Idx1).setIsUndef(Reg2IsUndef);
return MI;
}
Index: test/CodeGen/X86/pr23103.ll
===================================================================
--- test/CodeGen/X86/pr23103.ll
+++ test/CodeGen/X86/pr23103.ll
@@ -0,0 +1,17 @@
+; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx < %s
+
+; When commuting a VADDSDrr instruction, verify that the 'isUndef' flag is
+; correctly propagated to the operands of the resulting instruction.
+; Test for PR23103;
+
+declare zeroext i1 @foo()
+
+define <1 x double> @pr23103(<1 x double>* align 8) {
+entry:
+ %A1114 = load <1 x double>, <1 x double>* %0, align 8
+ %call.i = call zeroext i1 @foo()
+ %A1114.op = fadd <1 x double> %A1114, undef
+ %A1114.op.op = fadd <1 x double> %A1114.op, undef
+ %add4 = select i1 %call.i, <1 x double> <double fadd (double fadd (double 1.000000e+00, double undef), double undef)>, <1 x double> %A1114.op.op
+ ret <1 x double> %add4
+}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9406.24750.patch
Type: text/x-patch
Size: 1792 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150430/7fe32ed4/attachment.bin>
More information about the llvm-commits
mailing list