[PATCH] D14877: Fix ICE on lowering of constexpr vector splats

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Sat Nov 21 11:11:46 PST 2015


It would seem cleaner to build an ImplicitCastExpr node in Sema between the
operand and the splat node.
On Nov 20, 2015 11:04 AM, "George Burgess IV" <george.burgess.iv at gmail.com>
wrote:

> george.burgess.iv created this revision.
> george.burgess.iv added a reviewer: rsmith.
> george.burgess.iv added a subscriber: cfe-commits.
>
> When evaluating constexpr vector splats, we weren't doing appropriate type
> conversions on the literal we were splatting, causing assertion failures in
> cases like:
>
> ```
> void foo(vector float FloatInput, vector short ShortInput) {
>   (void)(FloatInput == (vector float)0); // OK
>   (void)(ShortInput == (vector short)0); // OK
>
>   constexpr vector float Floats = (vector float)0;
>   (void)(FloatInput == Floats); // ICE -- fcmp between [4 x i32] and [4 x
> f32]
>
>   constexpr vector short Shorts = (vector short)0;
>   (void)(ShortInput == Shorts); // ICE -- fcmp between vec of i16 and vec
> of i32
> }
> ```
>
> (The same issue applied for cases like `(vector short)0`; it would be
> lowered as a vector of `i32`.)
>
> This patch fixes these in ExprConstant rather than CodeGen, because it
> allows us to more sanely model overflow/complain to the user/... in the
> evaluator.
>
> This patch also contains a few generic code cleanliness changes. I'm happy
> to drop any/all of them if we decide they're not helpful. :)
>
> http://reviews.llvm.org/D14877
>
> Files:
>   lib/AST/ExprConstant.cpp
>   lib/CodeGen/CGExprConstant.cpp
>   test/CodeGenCXX/builtins-systemz-zvector.cpp
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151121/4740b70d/attachment.html>


More information about the cfe-commits mailing list