[cfe-dev] [OMP] Clang fails to handle parallel for + collapse
Samuel Pitoiset via cfe-dev
cfe-dev at lists.llvm.org
Tue Feb 16 06:49:35 PST 2016
Hi there,
It seems like Clang fails to create a OMPParallelForDirective object for
the given GCC test sample:
https://github.com/gcc-mirror/gcc/blob/master/libgomp/testsuite/libgomp.c/loop-9.c
I just tried to dump the AST with clang cc1 -ast-dump -fopenmp loop-9.c,
and the output is:
TranslationUnitDecl 0x3a53eb0 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x3a543c8 <<invalid sloc>> <invalid sloc> implicit
__int128_t '__int128'
| `-BuiltinType 0x3a54100 '__int128'
|-TypedefDecl 0x3a54428 <<invalid sloc>> <invalid sloc> implicit
__uint128_t 'unsigned __int128'
| `-BuiltinType 0x3a54120 'unsigned __int128'
|-TypedefDecl 0x3a546e8 <<invalid sloc>> <invalid sloc> implicit
__NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x3a54500 'struct __NSConstantString_tag'
| `-Record 0x3a54478 '__NSConstantString_tag'
|-TypedefDecl 0x3a54778 <<invalid sloc>> <invalid sloc> implicit
__builtin_ms_va_list 'char *'
| `-PointerType 0x3a54740 'char *'
| `-BuiltinType 0x3a53f40 'char'
|-TypedefDecl 0x3a54a28 <<invalid sloc>> <invalid sloc> implicit
__builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x3a549d0 'struct __va_list_tag [1]' 1
| `-RecordType 0x3a54850 'struct __va_list_tag'
| `-Record 0x3a547c8 '__va_list_tag'
|-FunctionDecl 0x3aa0780 <tests/gcc-testsuite/libgomp.c/loop-9.c:1:13>
col:13 implicit abort 'void (void) __attribute__((noreturn))' extern
|-FunctionDecl 0x3aa0828 prev 0x3aa0780 <col:1, col:24> col:13 used
abort 'void (void) __attribute__((noreturn))' extern
|-VarDecl 0x3aa0948 <line:3:1, col:15> col:6 used buf 'char [8]' cinit
| `-StringLiteral 0x3aa0a28 <col:15> 'char [8]' lvalue "01234567"
|-VarDecl 0x3aa0a98 <line:4:1, col:16> col:6 used buf2 'char [8]' cinit
| `-StringLiteral 0x3aa0af8 <col:16> 'char [8]' lvalue "23456789"
`-FunctionDecl 0x3aa0bf0 <line:6:1, line:18:1> line:7:1 main 'int (void)'
`-CompoundStmt 0x3aa4fe0 <line:8:1, line:18:1>
|-DeclStmt 0x3aa0dc0 <line:9:3, col:14>
| |-VarDecl 0x3aa0cd8 <col:3, col:9> col:9 used p 'char *'
| `-VarDecl 0x3aa0d48 <col:3, col:13> col:13 used q 'char *'
|-DeclStmt 0x3aa0e68 <line:10:3, col:14>
| `-VarDecl 0x3aa0de8 <col:3, col:13> col:7 used sum 'int' cinit
| `-IntegerLiteral 0x3aa0e48 <col:13> 'int' 0
|-IfStmt 0x3aa4f78 <line:15:3, line:16:12>
| |-<<<NULL>>>
| |-BinaryOperator 0x3aa4e98 <line:15:7, col:47> 'int' '||'
| | |-BinaryOperator 0x3aa4de8 <col:7, col:35> 'int' '||'
| | | |-BinaryOperator 0x3aa4cd0 <col:7, col:18> 'int' '!='
| | | | |-ImplicitCastExpr 0x3aa4cb8 <col:7> 'char *' <LValueToRValue>
| | | | | `-DeclRefExpr 0x3aa4be8 <col:7> 'char *' lvalue Var
0x3aa0cd8 'p' 'char *'
| | | | `-UnaryOperator 0x3aa4c98 <col:12, col:18> 'char *' prefix '&'
| | | | `-ArraySubscriptExpr 0x3aa4c70 <col:13, col:18> 'char' lvalue
| | | | |-ImplicitCastExpr 0x3aa4c58 <col:13> 'char *'
<ArrayToPointerDecay>
| | | | | `-DeclRefExpr 0x3aa4c10 <col:13> 'char [8]' lvalue
Var 0x3aa0948 'buf' 'char [8]'
| | | | `-IntegerLiteral 0x3aa4c38 <col:17> 'int' 8
| | | `-BinaryOperator 0x3aa4dc0 <col:23, col:35> 'int' '!='
| | | |-ImplicitCastExpr 0x3aa4da8 <col:23> 'char *' <LValueToRValue>
| | | | `-DeclRefExpr 0x3aa4cf8 <col:23> 'char *' lvalue Var
0x3aa0d48 'q' 'char *'
| | | `-BinaryOperator 0x3aa4d80 <col:28, col:35> 'char *' '+'
| | | |-ImplicitCastExpr 0x3aa4d68 <col:28> 'char *'
<ArrayToPointerDecay>
| | | | `-DeclRefExpr 0x3aa4d20 <col:28> 'char [8]' lvalue Var
0x3aa0a98 'buf2' 'char [8]'
| | | `-IntegerLiteral 0x3aa4d48 <col:35> 'int' 8
| | `-BinaryOperator 0x3aa4e70 <col:40, col:47> 'int' '!='
| | |-ImplicitCastExpr 0x3aa4e58 <col:40> 'int' <LValueToRValue>
| | | `-DeclRefExpr 0x3aa4e10 <col:40> 'int' lvalue Var 0x3aa0de8
'sum' 'int'
| | `-IntegerLiteral 0x3aa4e38 <col:47> 'int' 576
| |-CallExpr 0x3aa4f50 <line:16:5, col:12> 'void'
| | `-ImplicitCastExpr 0x3aa4f38 <col:5> 'void (*)(void)
__attribute__((noreturn))' <FunctionToPointerDecay>
| | `-DeclRefExpr 0x3aa4ee0 <col:5> 'void (void)
__attribute__((noreturn))' Function 0x3aa0828 'abort' 'void (void)
__attribute__((noreturn))'
| `-<<<NULL>>>
`-ReturnStmt 0x3aa4fc8 <line:17:3, col:10>
`-IntegerLiteral 0x3aa4fa8 <col:10> 'int' 0
As you can see, there is no OMPParallelForDirective.
Is it a bug in Clang? Or maybe the OMPParallelForDirective is not
created because the loop doesn't respect the canonical form described by
the OpenMP spec? In this case, it should be much better to return an
error message like "for is not canonical" or something.
This test can be compiled with GCC 5.3.
Thanks!
--
-Samuel
More information about the cfe-dev
mailing list