qiongsiwu1 added subscribers: bmahjour, anhtuyen, qiongsiwu1.
qiongsiwu1 added a comment.

Hi everyone! We are encountering crashes in some of our `altivec` test cases 
due to this change. `clang` crashes when we have an instance of a `struct` or 
`union` type, and we assign the result of a unary operator `++` or `--` with a 
vector operand to a field of the instance. If we are assigning the result to 
just a vector type, the compiler does not crash.

Here is a reproducer. To reproduce the crash, use command `clang -target 
powerpc-unknown-unknown -maltivec small.c`.

  // small.c
  #include <stdio.h>
  
  // struct type
  typedef struct result
  {
      vector signed short result_vec;
  } RESULT;
  
  vector signed short op_nine = { 9, 9, 9, 9, 9, 9, 9, 9 };
  
  int main() {
      // Instance of the struct type
      RESULT r;
  
      // This line below crashes - we are assigning the result of the unary 
operator to a struct field. 
      r.result_vec = ++op_nine;
      for (int i = 0; i < 8; ++i) {
          printf("%d\t", r.result_vec[i]);
      }
      printf("\n");
  
      // This case works fine. The compiler does not crash. 
      /*vector signed short op_10 = ++op_nine;
      for (int i = 0; i < 8; ++i) {
          printf("%d\t", op_10[i]);
      }
      printf("\n"); */
  }

We discovered this on AIX and we can reproduce this on Linux on Power. The 
issue is reproducible on Intel based Macs as well. Here is a stack dump from 
MacOS.

  Assertion failed: (isVector() && "Invalid accessor"), function 
getVectorLength, file 
/Users/qiongsiwu/workspace/community/llvm-project/clang/include/clang/AST/APValue.h,
 line 498.
  PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash 
backtrace, preprocessed source, and associated run script.
  Stack dump:
  0.    Program arguments: 
/Users/qiongsiwu/workspace/community/llvm-project/build/bin/clang-14 -cc1 
-triple powerpc-unknown-unknown -emit-obj -mrelax-all --mrelax-relocations 
-disable-free -clear-ast-before-backend -main-file-name small.c 
-mrelocation-model static -mframe-pointer=all -fmath-errno -ffp-contract=on 
-fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu ppc 
-target-feature +altivec -mfloat-abi hard -debugger-tuning=gdb 
-target-linker-version 650.9 
-fcoverage-compilation-dir=/Users/qiongsiwu/workspace/13359 -resource-dir 
/Users/qiongsiwu/workspace/community/llvm-project/build/lib/clang/14.0.0 -I 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/
 -fdebug-compilation-dir=/Users/qiongsiwu/workspace/13359 -ferror-limit 19 
-fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -faddrsig 
-D__GCC_HAVE_DWARF2_CFI_ASM=1 -o 
/var/folders/gh/5hw84m4x2hv4csmhpp8y02680000gn/T/small-e9e02b.o -x c small.c
  1.    small.c:23:5: current parser token 'return'
  2.    small.c:12:12: parsing function body 'main'
  3.    small.c:12:12: in compound statement ('{}')
  Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH 
or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
  0  clang-14                 0x0000000107d8d1f7 
llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 39
  1  clang-14                 0x0000000107d8bfb8 llvm::sys::RunSignalHandlers() 
+ 248
  2  clang-14                 0x0000000107d8d840 SignalHandler(int) + 272
  3  libsystem_platform.dylib 0x00007ff80662fe2d _sigtramp + 29
  4  libsystem_platform.dylib 0x00007ff7ba7632d0 _sigtramp + 
18446744072435741888
  5  libsystem_c.dylib        0x00007ff806566d10 abort + 123
  6  libsystem_c.dylib        0x00007ff8065660be err + 0
  7  clang-14                 0x000000010c208443 (anonymous 
namespace)::VectorExprEvaluator::VisitUnaryOperator(clang::UnaryOperator 
const*) (.cold.13) + 35
  8  clang-14                 0x000000010a40b1d7 (anonymous 
namespace)::VectorExprEvaluator::VisitUnaryOperator(clang::UnaryOperator 
const*) + 2375

On AIX, the compiler can produce the following AST during `EvaluateVector` 
before the crash.

  [EvaluateVector]
  BinaryOperator 0x11173e148 '__vector short' '='
  |-MemberExpr 0x11173e0e0 '__vector short' lvalue .result_vec 0x111739f40
  | `-DeclRefExpr 0x11173a5a0 'RESULT':'struct result' lvalue Var 0x11173a520 
'r' 'RESULT':'struct result'
  `-UnaryOperator 0x11173e130 '__vector short' prefix '++'
    `-DeclRefExpr 0x11173e110 '__vector short' lvalue Var 0x11173a070 'op_nine' 
'__vector short'
  [EvaluateVector]
  UnaryOperator 0x11173e130 '__vector short' prefix '++'
  `-DeclRefExpr 0x11173e110 '__vector short' lvalue Var 0x11173a070 'op_nine' 
'__vector short'

The compiler crashes when trying to deal with `0x11173a070`. It is expecting a 
vector kind (`APValue::ValueKind::Vector`), but the actual kind is 
`APValue::ValueKind::LValue`, and the compiler crashes inside 
`SubExprValue.getVectorLength()`.

Could you help us take a look? Thanks a lot! FYI @bmahjour @anhtuyen


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115670/new/

https://reviews.llvm.org/D115670

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to