diff --git a/libcilkrts/ChangeLog b/libcilkrts/ChangeLog index c340785992d..434b974d635 100644 --- a/libcilkrts/ChangeLog +++ b/libcilkrts/ChangeLog @@ -1,3 +1,10 @@ +2014-02-18 Balaji V. Iyer + + * include/cilk/common.h (__CILKRTS_ABI_VERSION): Set the ABI version + to 1 instead of 0. + * runtime/cilk-abi-cilk-for.cpp (cilk_for_recursive): Added a fix to + initialize stack frame correctly. + 2014-02-10 Balaji V. Iyer PR target/59691 diff --git a/libcilkrts/include/cilk/common.h b/libcilkrts/include/cilk/common.h index d2c84fa95a2..97dd66e0639 100644 --- a/libcilkrts/include/cilk/common.h +++ b/libcilkrts/include/cilk/common.h @@ -317,13 +317,12 @@ namespace cilk { #ifndef __CILKRTS_ABI_VERSION # ifdef IN_CILK_RUNTIME # define __CILKRTS_ABI_VERSION 1 -# elif __INTEL_COMPILER > 1200 - // Intel compiler version >= 12.1 -# define __CILKRTS_ABI_VERSION 1 -# else - // Compiler does not support ABI version 1 - // (Non-Intel compiler or Intel compiler prior to version 12.1). +# elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER <= 1200) + // Intel compilers prior to version 12.1 support only ABI 0 # define __CILKRTS_ABI_VERSION 0 +# else + // Non-Intel compiler or Intel compiler after version 12.0. +# define __CILKRTS_ABI_VERSION 1 # endif #endif diff --git a/libcilkrts/runtime/cilk-abi-cilk-for.cpp b/libcilkrts/runtime/cilk-abi-cilk-for.cpp index 4fa6dcec82a..4cd04f521cf 100644 --- a/libcilkrts/runtime/cilk-abi-cilk-for.cpp +++ b/libcilkrts/runtime/cilk-abi-cilk-for.cpp @@ -256,9 +256,19 @@ tail_recurse: // argument list of the spawned function, hence the call to // capture_spawn_arg_stack_frame(). __cilkrts_stack_frame *sf; +#if defined(__GNUC__) && ! defined(__INTEL_COMPILER) && ! defined(__clang__) + // The current version of gcc initializes the sf structure eagerly. + // We can take advantage of this fact to avoid calling + // `capture_spawn_arg_stack_frame` when compiling with gcc. + // Remove this if the "shrink-wrap" optimization is implemented. + sf = w->current_stack_frame; + _Cilk_spawn cilk_for_recursive(low, mid, body, data, grain, w, + loop_root_pedigree); +#else _Cilk_spawn cilk_for_recursive(low, mid, body, data, grain, capture_spawn_arg_stack_frame(sf, w), loop_root_pedigree); +#endif w = sf->worker; low = mid;