Mixed types aren't allowed. They are checked for in VerifySDNode in SelectionDAG.cpp and will fail an asserts build. ~Craig On Tue, Jul 7, 2020 at 8:25 AM Krzysztof Parzyszek via llvm-dev < llvm-dev at lists.llvm.org> wrote:> The problem can happen when you want to build a vector of i8, but i8 > itself is not legal on your target. All operands to BUILD_VECTOR will be > legalized to the next legal integer type, so you can end up with a > BUILD_VECTOR of vNi8 where all operands are i32, for example. > > Actual mixed types are less likely to happen, but if you are doing your > own target-specific lowering, you can end up with mixed types, simply > because your code doesn't have to make them all the same. > > -- > Krzysztof Parzyszek kparzysz at quicinc.com AI tools development > > > -----Original Message----- > > From: Cameron McInally <cameron.mcinally at nyu.edu> > > Sent: Tuesday, July 7, 2020 10:10 AM > > To: Krzysztof Parzyszek <kparzysz at quicinc.com> > > Cc: llvm-dev at lists.llvm.org > > Subject: [EXT] Re: [llvm-dev] BUILD_VECTOR disambiguation > > > > Thanks for the clarification. The `except` seemed dangling to me, but > it's > > early here. > > > > Just curious... how do we end up with a mixed type BUILD_VECTOR? > > That's counterintuitive. > > > > On Tue, Jul 7, 2020 at 10:58 AM Krzysztof Parzyszek via llvm-dev <llvm- > > dev at lists.llvm.org> wrote: > > > > > > Mixed integer types are ok, but the values will get truncated to the > > element type of the output value. It's pretty much what the comment > says. > > > > > > -- > > > Krzysztof Parzyszek kparzysz at quicinc.com AI tools development > > > > > > > -----Original Message----- > > > > From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of > > > > Cameron McInally via llvm-dev > > > > Sent: Tuesday, July 7, 2020 9:53 AM > > > > To: LLVM Developers Mailing List <llvm-dev at lists.llvm.org> > > > > Subject: [EXT] [llvm-dev] BUILD_VECTOR disambiguation > > > > > > > > Hey devs, > > > > > > > > From ISDOpcodes.h... > > > > > > > > /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width > > > > vector /// with the specified, possibly variable, elements. The > > > > number of elements /// is required to be a power of two. The types > > > > of the operands must all be /// the same and must match the vector > > > > element type, except that integer types /// are allowed to be larger > > > > than the element type, in which case the operands /// are implicitly > > truncated. > > > > BUILD_VECTOR, > > > > > > > > Must the operand types always be the same? Or could we see a > > > > BUILD_VECTOR with mixed integer types? E.g.: > > > > > > > > BUILD_VECTOR(i32, i32, i64, i32) > > > > > > > > Thanks, > > > > Cam > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200707/cfef468b/attachment.html>
Cameron McInally via llvm-dev
2020-Jul-07 15:55 UTC
[llvm-dev] BUILD_VECTOR disambiguation
That's what I would expect. I don't see a good a priori reason to build a vector with mixed operand types. IMO, the BUILD_VECTOR specification should be tightened up. On Tue, Jul 7, 2020 at 11:47 AM Craig Topper <craig.topper at gmail.com> wrote:> > Mixed types aren't allowed. They are checked for in VerifySDNode in SelectionDAG.cpp and will fail an asserts build. > > ~Craig > > > On Tue, Jul 7, 2020 at 8:25 AM Krzysztof Parzyszek via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> The problem can happen when you want to build a vector of i8, but i8 itself is not legal on your target. All operands to BUILD_VECTOR will be legalized to the next legal integer type, so you can end up with a BUILD_VECTOR of vNi8 where all operands are i32, for example. >> >> Actual mixed types are less likely to happen, but if you are doing your own target-specific lowering, you can end up with mixed types, simply because your code doesn't have to make them all the same. >> >> -- >> Krzysztof Parzyszek kparzysz at quicinc.com AI tools development >> >> > -----Original Message----- >> > From: Cameron McInally <cameron.mcinally at nyu.edu> >> > Sent: Tuesday, July 7, 2020 10:10 AM >> > To: Krzysztof Parzyszek <kparzysz at quicinc.com> >> > Cc: llvm-dev at lists.llvm.org >> > Subject: [EXT] Re: [llvm-dev] BUILD_VECTOR disambiguation >> > >> > Thanks for the clarification. The `except` seemed dangling to me, but it's >> > early here. >> > >> > Just curious... how do we end up with a mixed type BUILD_VECTOR? >> > That's counterintuitive. >> > >> > On Tue, Jul 7, 2020 at 10:58 AM Krzysztof Parzyszek via llvm-dev <llvm- >> > dev at lists.llvm.org> wrote: >> > > >> > > Mixed integer types are ok, but the values will get truncated to the >> > element type of the output value. It's pretty much what the comment says. >> > > >> > > -- >> > > Krzysztof Parzyszek kparzysz at quicinc.com AI tools development >> > > >> > > > -----Original Message----- >> > > > From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of >> > > > Cameron McInally via llvm-dev >> > > > Sent: Tuesday, July 7, 2020 9:53 AM >> > > > To: LLVM Developers Mailing List <llvm-dev at lists.llvm.org> >> > > > Subject: [EXT] [llvm-dev] BUILD_VECTOR disambiguation >> > > > >> > > > Hey devs, >> > > > >> > > > From ISDOpcodes.h... >> > > > >> > > > /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width >> > > > vector /// with the specified, possibly variable, elements. The >> > > > number of elements /// is required to be a power of two. The types >> > > > of the operands must all be /// the same and must match the vector >> > > > element type, except that integer types /// are allowed to be larger >> > > > than the element type, in which case the operands /// are implicitly >> > truncated. >> > > > BUILD_VECTOR, >> > > > >> > > > Must the operand types always be the same? Or could we see a >> > > > BUILD_VECTOR with mixed integer types? E.g.: >> > > > >> > > > BUILD_VECTOR(i32, i32, i64, i32) >> > > > >> > > > Thanks, >> > > > Cam >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Cameron McInally via llvm-dev
2020-Jul-08 17:49 UTC
[llvm-dev] BUILD_VECTOR disambiguation
Proposal to change the BUILD_VECTOR comment posted in D83413, if anyone would like to comment. Thanks again, Cam On Tue, Jul 7, 2020 at 11:55 AM Cameron McInally <cameron.mcinally at nyu.edu> wrote:> > That's what I would expect. I don't see a good a priori reason to > build a vector with mixed operand types. IMO, the BUILD_VECTOR > specification should be tightened up. > > On Tue, Jul 7, 2020 at 11:47 AM Craig Topper <craig.topper at gmail.com> wrote: > > > > Mixed types aren't allowed. They are checked for in VerifySDNode in SelectionDAG.cpp and will fail an asserts build. > > > > ~Craig > > > > > > On Tue, Jul 7, 2020 at 8:25 AM Krzysztof Parzyszek via llvm-dev <llvm-dev at lists.llvm.org> wrote: > >> > >> The problem can happen when you want to build a vector of i8, but i8 itself is not legal on your target. All operands to BUILD_VECTOR will be legalized to the next legal integer type, so you can end up with a BUILD_VECTOR of vNi8 where all operands are i32, for example. > >> > >> Actual mixed types are less likely to happen, but if you are doing your own target-specific lowering, you can end up with mixed types, simply because your code doesn't have to make them all the same. > >> > >> -- > >> Krzysztof Parzyszek kparzysz at quicinc.com AI tools development > >> > >> > -----Original Message----- > >> > From: Cameron McInally <cameron.mcinally at nyu.edu> > >> > Sent: Tuesday, July 7, 2020 10:10 AM > >> > To: Krzysztof Parzyszek <kparzysz at quicinc.com> > >> > Cc: llvm-dev at lists.llvm.org > >> > Subject: [EXT] Re: [llvm-dev] BUILD_VECTOR disambiguation > >> > > >> > Thanks for the clarification. The `except` seemed dangling to me, but it's > >> > early here. > >> > > >> > Just curious... how do we end up with a mixed type BUILD_VECTOR? > >> > That's counterintuitive. > >> > > >> > On Tue, Jul 7, 2020 at 10:58 AM Krzysztof Parzyszek via llvm-dev <llvm- > >> > dev at lists.llvm.org> wrote: > >> > > > >> > > Mixed integer types are ok, but the values will get truncated to the > >> > element type of the output value. It's pretty much what the comment says. > >> > > > >> > > -- > >> > > Krzysztof Parzyszek kparzysz at quicinc.com AI tools development > >> > > > >> > > > -----Original Message----- > >> > > > From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of > >> > > > Cameron McInally via llvm-dev > >> > > > Sent: Tuesday, July 7, 2020 9:53 AM > >> > > > To: LLVM Developers Mailing List <llvm-dev at lists.llvm.org> > >> > > > Subject: [EXT] [llvm-dev] BUILD_VECTOR disambiguation > >> > > > > >> > > > Hey devs, > >> > > > > >> > > > From ISDOpcodes.h... > >> > > > > >> > > > /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width > >> > > > vector /// with the specified, possibly variable, elements. The > >> > > > number of elements /// is required to be a power of two. The types > >> > > > of the operands must all be /// the same and must match the vector > >> > > > element type, except that integer types /// are allowed to be larger > >> > > > than the element type, in which case the operands /// are implicitly > >> > truncated. > >> > > > BUILD_VECTOR, > >> > > > > >> > > > Must the operand types always be the same? Or could we see a > >> > > > BUILD_VECTOR with mixed integer types? E.g.: > >> > > > > >> > > > BUILD_VECTOR(i32, i32, i64, i32) > >> > > > > >> > > > Thanks, > >> > > > Cam > >> _______________________________________________ > >> LLVM Developers mailing list > >> llvm-dev at lists.llvm.org > >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev