Author: Erich Keane Date: 2022-01-04T09:53:26-08:00 New Revision: 2edc21e8566be8fa9b20e0bb71a83af90ec9aa97
URL: https://github.com/llvm/llvm-project/commit/2edc21e8566be8fa9b20e0bb71a83af90ec9aa97 DIFF: https://github.com/llvm/llvm-project/commit/2edc21e8566be8fa9b20e0bb71a83af90ec9aa97.diff LOG: Fix altivec regression caused by D115670 in Vec Const Eval The Vector Constant Evaluator assumes that all the types of its sub-expressions are going to be Vector APValues, which holds for most situations. However, in the 1 examples of Altivec C compilation of operator ++ (not allowed for other vector types), the result is an LValue. Since the operator isn't supported for constant evaluation anyway, this patch just fails-out of constant eval if we are in a situation where the operand to the unary operator causes an LValue. Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/Sema/altivec-init.c Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 3bf205d8cb064..9412aba42dfb7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -10434,6 +10434,15 @@ bool VectorExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { if (!Evaluate(SubExprValue, Info, SubExpr)) return false; + // FIXME: This vector evaluator someday needs to be changed to be LValue + // aware/keep LValue information around, rather than dealing with just vector + // types directly. Until then, we cannot handle cases where the operand to + // these unary operators is an LValue. The only case I've been able to see + // cause this is operator++ assigning to a member expression (only valid in + // altivec compilations) in C mode, so this shouldn't limit us too much. + if (SubExprValue.isLValue()) + return false; + assert(SubExprValue.getVectorLength() == VD->getNumElements() && "Vector length doesn't match type?"); diff --git a/clang/test/Sema/altivec-init.c b/clang/test/Sema/altivec-init.c index 1c20450a6d015..ee38e70706714 100644 --- a/clang/test/Sema/altivec-init.c +++ b/clang/test/Sema/altivec-init.c @@ -45,3 +45,16 @@ void test() int res = vGCC > vAltiVec; vAltiVec = 0 ? vGCC : vGCC; } + +typedef struct VecMem { + vector signed vec; +} VecMem; + +// The following should not assert. See qiongsiwu1's comment here: +// https://reviews.llvm.org/D115670 +void test2() { + vector signed local_vec = {1, 2, 3, 4}; + VecMem VM; + VM.vec = ++local_vec; +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits