HomePhabricator

Correct gcc vector splat conversion from float to int-vector

Authored by erichkeane on Dec 13 2019, 12:15 PM.

Description

Correct gcc vector splat conversion from float to int-vector

In looking into some other code, I came across this issue where a
float converted to a gcc integer vector via a splat causes it to miss
the float-to-integral cast, which causes some REALLY strange codegen
bugs.

The AST looked like:
`-ImplicitCastExpr <col:13>
'gcc_int_2':'attribute((vector_size(2 * sizeof(int)))) int' <VectorSplat>

`-ImplicitCastExpr <col:13> 'float' <LValueToRValue>
          `-DeclRefExpr <col:13> 'float' lvalue ParmVar
          0x556f16a5dc90 'f' 'float'

Despite the type of the VectorSplat cast as printed, it ended up
becoming a vector of float, which caused non-matching instructions. For
example, IntVector + a float constant resulted in:

add <2 x i32> %8, <2 x float> <float 3.000000e+00, float 3.000000e+00>

This patch corrects the conversion so that the float is first converted
to an integral, THEN splatted.

Details

Committed
erichkeaneDec 13 2019, 12:27 PM
Parents
rGa0f43b004358: [RISCV] Move DebugLoc Copy into CompressInstEmitter
Branches
Unknown
Tags
Unknown