Fan Dawei
2011-Oct-19 08:09 UTC
[LLVMdev] Error when cond of select instruction is a vector
Hi LLVMdev, In the specification of llvm ir, the select operation can takes a condition of vector type, 'select' Instruction Syntax: <result> = select *selty* <cond>, <ty> <val1>, <ty> <val2> *; yields ty* *selty* is either i1 or {<N x i1>} Overview: The 'select' instruction is used to choose one value based on a condition, without branching. If the condition is a vector of i1, then the value arguments must be vectors of the same size, and the selection is done element by element. However when I create a program use vector of il as the type of condition. The back-end fails and complains: *SplitVectorOperand Op #0: 0x2b75370: f32 = select 0x2b6c800, 0x2b75270, 0x2b75170 [ID=0] Do not know how to split this operator's operand!* The following program is a valid IR which passed by the checker. However the back-end fails on all the targets I've tested, including x86, mips and sparc. Is it a target independent bug? define void @main() { entry: %Cy300 = alloca <4 x float> %Cy11a = alloca <2 x float> %Cy118 = alloca <2 x float> %Cy119 = alloca <2 x float> br label %B1 B1: ; preds = %entry %0 = load <2 x float>* %Cy119 %1 = fptosi <2 x float> %0 to <2 x i32> %2 = sitofp <2 x i32> %1 to <2 x float> %3 = fcmp ogt <2 x float> %0, zeroinitializer %4 = fadd <2 x float> %2, <float 1.000000e+00, float 1.000000e+00> %5 = select <2 x i1> %3, <2 x float> %4, <2 x float> %2 %6 = fcmp oeq <2 x float> %2, %0 %7 = select <2 x i1> %6, <2 x float> %0, <2 x float> %5 store <2 x float> %7, <2 x float>* %Cy118 %8 = load <2 x float>* %Cy118 store <2 x float> %8, <2 x float>* %Cy11a ret void } Thanks, David -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111019/76b51d59/attachment.html>
Rotem, Nadav
2011-Oct-19 08:21 UTC
[LLVMdev] Error when cond of select instruction is a vector
This is indeed a bug. I get a different error on my machine. Until we solve this bug, as a workaround, you can use the <4 x float> type for which the vselect works. From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Fan Dawei Sent: Wednesday, October 19, 2011 10:10 To: LLVMdev at cs.uiuc.edu Subject: [LLVMdev] Error when cond of select instruction is a vector Hi LLVMdev, In the specification of llvm ir, the select operation can takes a condition of vector type, 'select' Instruction Syntax: <result> = select selty <cond>, <ty> <val1>, <ty> <val2> ; yields ty selty is either i1 or {<N x i1>} Overview: The 'select' instruction is used to choose one value based on a condition, without branching. If the condition is a vector of i1, then the value arguments must be vectors of the same size, and the selection is done element by element. However when I create a program use vector of il as the type of condition. The back-end fails and complains: SplitVectorOperand Op #0: 0x2b75370: f32 = select 0x2b6c800, 0x2b75270, 0x2b75170 [ID=0] Do not know how to split this operator's operand! The following program is a valid IR which passed by the checker. However the back-end fails on all the targets I've tested, including x86, mips and sparc. Is it a target independent bug? define void @main() { entry: %Cy300 = alloca <4 x float> %Cy11a = alloca <2 x float> %Cy118 = alloca <2 x float> %Cy119 = alloca <2 x float> br label %B1 B1: ; preds = %entry %0 = load <2 x float>* %Cy119 %1 = fptosi <2 x float> %0 to <2 x i32> %2 = sitofp <2 x i32> %1 to <2 x float> %3 = fcmp ogt <2 x float> %0, zeroinitializer %4 = fadd <2 x float> %2, <float 1.000000e+00, float 1.000000e+00> %5 = select <2 x i1> %3, <2 x float> %4, <2 x float> %2 %6 = fcmp oeq <2 x float> %2, %0 %7 = select <2 x i1> %6, <2 x float> %0, <2 x float> %5 store <2 x float> %7, <2 x float>* %Cy118 %8 = load <2 x float>* %Cy118 store <2 x float> %8, <2 x float>* %Cy11a ret void } Thanks, David --------------------------------------------------------------------- Intel Israel (74) Limited This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111019/5bbf8aff/attachment.html>
Fan Dawei
2011-Oct-19 09:06 UTC
[LLVMdev] Error when cond of select instruction is a vector
Hi Rotem, What do you mean by "you can use the <4 x float> type for which the vselect works". Do you mean that then back-end can correctly split the operands when it is a four elements vector? I've try that, but it still fails. On Wed, Oct 19, 2011 at 4:21 PM, Rotem, Nadav <nadav.rotem at intel.com> wrote:> This is indeed a bug. I get a different error on my machine. Until we solve > this bug, as a workaround, you can use the <4 x float> type for which the > vselect works. **** > > ** ** > > ** ** > > *From:* llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] *On > Behalf Of *Fan Dawei > *Sent:* Wednesday, October 19, 2011 10:10 > *To:* LLVMdev at cs.uiuc.edu > *Subject:* [LLVMdev] Error when cond of select instruction is a vector**** > > ** ** > > Hi LLVMdev, > > In the specification of llvm ir, the select operation can takes a condition > of vector type,**** > 'select' Instruction ****Syntax:**** > > <result> = select *selty* <cond>, <ty> <val1>, <ty> <val2> *; yields ty***** > > ** ** > > *selty* is either i1 or {<N x i1>}**** > > Overview:**** > > The 'select' instruction is used to choose one value based on a condition, > without branching.**** > > > If the condition is a vector of i1, then the value arguments must be > vectors of the same size, and the selection is done element by element. > > However when I create a program use vector of il as the type of condition. > The back-end fails and complains: > > *SplitVectorOperand Op #0: 0x2b75370: f32 = select 0x2b6c800, 0x2b75270, > 0x2b75170 [ID=0] > > Do not know how to split this operator's operand!* > > The following program is a valid IR which passed by the checker. However > the back-end fails on all the targets I've tested, including x86, mips and > sparc. Is it a target independent bug? > > define void @main() { > entry: > %Cy300 = alloca <4 x float> > %Cy11a = alloca <2 x float> > %Cy118 = alloca <2 x float> > %Cy119 = alloca <2 x float> > br label %B1 > > B1: ; preds = %entry > %0 = load <2 x float>* %Cy119 > %1 = fptosi <2 x float> %0 to <2 x i32> > %2 = sitofp <2 x i32> %1 to <2 x float> > %3 = fcmp ogt <2 x float> %0, zeroinitializer > %4 = fadd <2 x float> %2, <float 1.000000e+00, float 1.000000e+00> > %5 = select <2 x i1> %3, <2 x float> %4, <2 x float> %2 > %6 = fcmp oeq <2 x float> %2, %0 > %7 = select <2 x i1> %6, <2 x float> %0, <2 x float> %5 > store <2 x float> %7, <2 x float>* %Cy118 > %8 = load <2 x float>* %Cy118 > store <2 x float> %8, <2 x float>* %Cy11a > ret void > } > > > Thanks, > David**** > --------------------------------------------------------------------- > Intel Israel (74) Limited > > This e-mail and any attachments may contain confidential material for > the sole use of the intended recipient(s). Any review or distribution > by others is strictly prohibited. If you are not the intended > recipient, please contact the sender and delete all copies. >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111019/32d65567/attachment.html>