From 4d9687e70e2d71097cd43929d5f63377c3c44523 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Wed, 21 Oct 2020 18:33:36 +0100 Subject: Address RVO issue on some compilers Suppresses pessimizing-move during clang compilation as for some gcc toolchains RVO is not ensured until C++17 thus an explicit call to std::move might be required to avoid compilation error for non-copyable ojects (e.g. std::unique_ptr) Resolves: COMPMID-3599 Signed-off-by: Georgios Pinitas Change-Id: Ie3fa44fb0cf631655aecbeb6c82021a68f500a33 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4230 Reviewed-by: Giorgio Arena Reviewed-by: Michalis Spyrou Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins --- SConscript | 26 +++++---- arm_compute/graph/backends/FunctionHelpers.h | 81 ++++++++++++-------------- src/graph/backends/CL/CLFunctionsFactory.cpp | 4 +- src/graph/backends/GLES/GCFunctionsFactory.cpp | 6 +- src/graph/backends/NEON/NEFunctionFactory.cpp | 3 +- 5 files changed, 59 insertions(+), 61 deletions(-) diff --git a/SConscript b/SConscript index 656336d555..2b70ca18b8 100644 --- a/SConscript +++ b/SConscript @@ -42,14 +42,14 @@ def build_bootcode_objs(sources): Default(obj) return obj -def build_library(name, sources, static=False, libs=[]): +def build_library(name, build_env, sources, static=False, libs=[]): if static: - obj = arm_compute_env.StaticLibrary(name, source=sources, LIBS = arm_compute_env["LIBS"] + libs) + obj = build_env.StaticLibrary(name, source=sources, LIBS = arm_compute_env["LIBS"] + libs) else: if env['set_soname']: - obj = arm_compute_env.SharedLibrary(name, source=sources, SHLIBVERSION = SONAME_VERSION, LIBS = arm_compute_env["LIBS"] + libs) + obj = build_env.SharedLibrary(name, source=sources, SHLIBVERSION = SONAME_VERSION, LIBS = arm_compute_env["LIBS"] + libs) else: - obj = arm_compute_env.SharedLibrary(name, source=sources, LIBS = arm_compute_env["LIBS"] + libs) + obj = build_env.SharedLibrary(name, source=sources, LIBS = arm_compute_env["LIBS"] + libs) obj = install_lib(obj) Default(obj) @@ -137,6 +137,9 @@ arm_compute_env = env.Clone() version_file = arm_compute_env.Command("src/core/arm_compute_version.embed", "", action=create_version_file) arm_compute_env.AlwaysBuild(version_file) +default_cpp_compiler = 'g++' if env['os'] != 'android' else 'clang++' +cpp_compiler = os.environ.get('CXX', default_cpp_compiler) + # Generate embed files generate_embed = [ version_file ] if env['opencl'] and env['embed_kernels']: @@ -282,26 +285,29 @@ if env['os'] == 'bare_metal': bootcode_o = build_bootcode_objs(bootcode_files) Export('bootcode_o') -arm_compute_core_a = build_library('arm_compute_core-static', core_files, static=True) +arm_compute_core_a = build_library('arm_compute_core-static', arm_compute_env, core_files, static=True) Export('arm_compute_core_a') if env['os'] != 'bare_metal' and not env['standalone']: - arm_compute_core_so = build_library('arm_compute_core', core_files, static=False) + arm_compute_core_so = build_library('arm_compute_core', arm_compute_env, core_files, static=False) Export('arm_compute_core_so') -arm_compute_a = build_library('arm_compute-static', runtime_files, static=True, libs = [ arm_compute_core_a ]) +arm_compute_a = build_library('arm_compute-static', arm_compute_env, runtime_files, static=True, libs = [ arm_compute_core_a ]) Export('arm_compute_a') if env['os'] != 'bare_metal' and not env['standalone']: - arm_compute_so = build_library('arm_compute', runtime_files, static=False, libs = [ "arm_compute_core" ]) + arm_compute_so = build_library('arm_compute', arm_compute_env, runtime_files, static=False, libs = [ "arm_compute_core" ]) Depends(arm_compute_so, arm_compute_core_so) Export('arm_compute_so') -arm_compute_graph_a = build_library('arm_compute_graph-static', graph_files, static=True, libs = [ arm_compute_a]) +arm_compute_graph_env = arm_compute_env.Clone(); +if 'clang++' in cpp_compiler: + arm_compute_graph_env.Append(CXXFLAGS = ['-Wno-pessimizing-move']) +arm_compute_graph_a = build_library('arm_compute_graph-static', arm_compute_graph_env, graph_files, static=True, libs = [ arm_compute_a]) Export('arm_compute_graph_a') if env['os'] != 'bare_metal' and not env['standalone']: - arm_compute_graph_so = build_library('arm_compute_graph', graph_files, static=False, libs = [ "arm_compute" , "arm_compute_core"]) + arm_compute_graph_so = build_library('arm_compute_graph', arm_compute_graph_env, graph_files, static=False, libs = [ "arm_compute" , "arm_compute_core"]) Depends(arm_compute_graph_so, arm_compute_so) Export('arm_compute_graph_so') diff --git a/arm_compute/graph/backends/FunctionHelpers.h b/arm_compute/graph/backends/FunctionHelpers.h index 873957e6b7..ee5dc3e285 100644 --- a/arm_compute/graph/backends/FunctionHelpers.h +++ b/arm_compute/graph/backends/FunctionHelpers.h @@ -47,13 +47,6 @@ namespace backends { namespace detail { -// Address rule DR-9R5 (1579. Return by converting move constructor) -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5)) -#define RETURN_UNIQUE_PTR(x) (x) -#else /* defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5)) */ -#define RETURN_UNIQUE_PTR(x) (std::move(x)) -#endif /* defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5)) */ - /** Returns backing tensor of a given tensor * * @tparam TargetInfo Target information @@ -128,7 +121,7 @@ std::unique_ptr create_activation_layer(ActivationLayerNode &node) << " InPlace : " << is_in_place_operation(input, output) << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Creates a backend argminmax layer function @@ -165,7 +158,7 @@ std::unique_ptr create_arg_min_max_layer(ArgMinMaxLayerNode &node) << " axis: " << axis << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend batch normalization layer function @@ -209,7 +202,7 @@ std::unique_ptr create_batch_normalization_layer(BatchNormalizationLa << " InPlace: " << is_in_place_operation(input, output) << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend batch normalization layer function @@ -266,7 +259,7 @@ std::unique_ptr create_fused_convolution_batch_normalization_layer(Fu << " Output shape: " << output->info()->tensor_shape() << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "") << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend fused depthwise convolution batch normalization layer function @@ -322,7 +315,7 @@ std::unique_ptr create_fused_depthwise_convolution_batch_normalizatio << " Output shape: " << output->info()->tensor_shape() << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "") << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend bounding box transform layer function @@ -360,7 +353,7 @@ std::unique_ptr create_bounding_box_transform_layer(BoundingBoxTransf << " BoundingBox Info img H: " << bbox_info.img_height() << " " << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend channel shuffle layer function @@ -395,7 +388,7 @@ std::unique_ptr create_channel_shuffle_layer(ChannelShuffleLayerNode << " Num groups: " << num_groups << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend layer concatenate function @@ -451,7 +444,7 @@ std::unique_ptr create_concatenate_layer(ConcatenateLaye << qss.str() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend convolution layer function @@ -542,7 +535,7 @@ std::unique_ptr create_convolution_layer(ConvolutionLayerNode &node, << qss.str() << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "") << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend deconvolution layer function @@ -648,7 +641,7 @@ std::unique_ptr create_depthwise_convolution_layer(DepthwiseConvoluti << qss.str() << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "") << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend depth to space layer function @@ -687,7 +680,7 @@ std::unique_ptr create_depth_to_space_layer(DepthToSpaceLayerNode &no << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend dequantize layer function @@ -726,7 +719,7 @@ std::unique_ptr create_dequantization_layer(DequantizationLayerNode & << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend detection output layer function * @@ -771,7 +764,7 @@ std::unique_ptr create_detection_output_layer(DetectionOutputLayerNod << " DetectionOutputLayer info: " << detect_info << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend detection post process layer function @@ -826,7 +819,7 @@ std::unique_ptr create_detection_post_process_layer(DetectionPostProc << " DetectionPostProcessLayer info: " << detect_info << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend element-wise operation layer function @@ -895,7 +888,7 @@ std::unique_ptr create_eltwise_layer(EltwiseLayerNode &node) << " Shape: " << input1->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend unary element-wise operation layer function @@ -943,7 +936,7 @@ std::unique_ptr create_unary_eltwise_layer(UnaryEltwiseLayerNode &nod << " Shape: " << input->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend flatten layer function @@ -981,7 +974,7 @@ std::unique_ptr create_flatten_layer(FlattenLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend fully connected layer function @@ -1037,7 +1030,7 @@ std::unique_ptr create_fully_connected_layer(FullyConnectedLayerNode << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend generate proposals layer function @@ -1086,7 +1079,7 @@ std::unique_ptr create_generate_proposals_layer(GenerateProposalsLaye << " Scores Out shape: " << scores_out->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend l2 normalization layer function @@ -1130,7 +1123,7 @@ std::unique_ptr create_l2_normalize_layer(L2NormalizeLayerNode &node, << " Epsilon: " << epsilon << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend normalization layer function @@ -1172,7 +1165,7 @@ std::unique_ptr create_normalization_layer(NormalizationLayerNode &no << " Normalization info: " << norm_info.type() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend normalize planar YUV layer function @@ -1212,7 +1205,7 @@ std::unique_ptr create_normalize_planar_yuv_layer(NormalizePlanarYUVL << " Shape: " << input->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend pad layer function @@ -1251,7 +1244,7 @@ std::unique_ptr create_pad_layer(PadLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend permute layer function @@ -1290,7 +1283,7 @@ std::unique_ptr create_permute_layer(PermuteLayerNode &node) << " Permutation vector: " << perm << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend pooling layer function @@ -1329,7 +1322,7 @@ std::unique_ptr create_pooling_layer(PoolingLayerNode &node) << " Pooling info: " << pool_info.pool_type << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend PRelu layer function @@ -1367,7 +1360,7 @@ std::unique_ptr create_prelu_layer(PReluLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend print layer function @@ -1438,7 +1431,7 @@ std::unique_ptr create_priorbox_layer(PriorBoxLayerNode &node) << " PriorBoxLayer info: " << prior_info << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend quantization layer function @@ -1475,7 +1468,7 @@ std::unique_ptr create_quantization_layer(QuantizationLayerNode &node << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend reduction operation layer function @@ -1519,7 +1512,7 @@ std::unique_ptr create_reduction_operation_layer(ReductionLayerNode & << " Keep dimensions:" << keep_dims << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend reorg layer function @@ -1556,7 +1549,7 @@ std::unique_ptr create_reorg_layer(ReorgLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend reshape layer function @@ -1593,7 +1586,7 @@ std::unique_ptr create_reshape_layer(ReshapeLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend resize layer function @@ -1632,7 +1625,7 @@ std::unique_ptr create_resize_layer(ResizeLayerNode &node) << " Interpolation: " << policy << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend ROI align layer function @@ -1677,7 +1670,7 @@ std::unique_ptr create_roi_align_layer(ROIAlignLayerNode &node) << " ROIPooling height: " << pool_info.pooled_height() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend slice layer function @@ -1714,7 +1707,7 @@ std::unique_ptr create_slice_layer(SliceLayerNode &node) << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend softmax layer function @@ -1753,7 +1746,7 @@ std::unique_ptr create_softmax_layer(SoftmaxLayerNode &node, GraphCon << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend layer stack function @@ -1796,7 +1789,7 @@ std::unique_ptr create_stack_layer(StackLayerNode &node) << " Axis: " << axis << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } /** Create a backend slice layer function @@ -1838,7 +1831,7 @@ std::unique_ptr create_strided_slice_layer(StridedSliceLayerNode &nod << " Output shape: " << output->info()->tensor_shape() << std::endl); - return RETURN_UNIQUE_PTR(func); + return std::move(func); } } // namespace detail } // namespace backends diff --git a/src/graph/backends/CL/CLFunctionsFactory.cpp b/src/graph/backends/CL/CLFunctionsFactory.cpp index 619641804b..5c98ce3b85 100644 --- a/src/graph/backends/CL/CLFunctionsFactory.cpp +++ b/src/graph/backends/CL/CLFunctionsFactory.cpp @@ -167,7 +167,7 @@ std::unique_ptr create_detection_output_layerregister_tensor(input2); wrap_function->register_tensor(output); - return RETURN_UNIQUE_PTR(wrap_function); + return std::move(wrap_function); } template <> std::unique_ptr create_detection_post_process_layer(DetectionPostProcessLayerNode &node) @@ -223,7 +223,7 @@ std::unique_ptr create_detection_post_process_layerregister_tensor(output2); wrap_function->register_tensor(output3); - return RETURN_UNIQUE_PTR(wrap_function); + return std::move(wrap_function); } } // namespace detail diff --git a/src/graph/backends/GLES/GCFunctionsFactory.cpp b/src/graph/backends/GLES/GCFunctionsFactory.cpp index 7d9d388ebe..ac14425ad4 100644 --- a/src/graph/backends/GLES/GCFunctionsFactory.cpp +++ b/src/graph/backends/GLES/GCFunctionsFactory.cpp @@ -120,7 +120,7 @@ std::unique_ptr create_convolution_layerinfo()->tensor_shape() << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "") << std::endl); - return func; + return std::move(func); } template <> @@ -172,7 +172,7 @@ std::unique_ptr create_depthwise_convolution_layer @@ -226,7 +226,7 @@ std::unique_ptr create_eltwise_layerinfo()->tensor_shape() << std::endl); - return func; + return std::move(func); } } //namespace detail diff --git a/src/graph/backends/NEON/NEFunctionFactory.cpp b/src/graph/backends/NEON/NEFunctionFactory.cpp index b2bd87070c..6a96f0a5b9 100644 --- a/src/graph/backends/NEON/NEFunctionFactory.cpp +++ b/src/graph/backends/NEON/NEFunctionFactory.cpp @@ -32,7 +32,6 @@ #include "arm_compute/graph/nodes/Nodes.h" #include "arm_compute/runtime/CPP/CPPFunctions.h" #include "arm_compute/runtime/NEON/NEFunctions.h" -#include "src/core/NEON/NEKernels.h" #include "support/Cast.h" #include "support/ToolchainSupport.h" @@ -116,7 +115,7 @@ std::unique_ptr create_normalization_layer