This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/4] BRIG (HSAIL) frontend: The FE itself.


Hi,

Updated patch attached. Cleaned up issues found by contrib/check-GNU-style and
other misc. updates.

All changes to the whole patch set in comparison to the previous
submission are in the 005 diff.


On Mon, Aug 15, 2016 at 4:22 PM, Pekka Jääskeläinen <pekka@parmance.com> wrote:
> Thanks a lot for the review Martin,
>
> Responses inline:
>
> On Mon, Aug 1, 2016 at 7:37 PM, Martin Jambor <mjambor@suse.cz> wrote:
>>
>>   - I would definitely appreciate more comments.  All but the most
>>     trivial functions should have one that describes what the function
>>     does, what are its arguments and what it returns.  (And there
>>     should be one blank line between the comment and the function
>>     itself).
>
>
> I added more comments. Please let me know if I missed a non-trivial one.
>
>>
>>
>>   - We very much prefer c-style comments to c++ ones.  I hope they can
>>     be converted easily in some automated way.
>
>
> Converted.
>
>>
>>
>> So far I have the following specific comments:
>>
>> - brig-c.h
>>   + please remove commented out extern GTY (()) tree brig_non_zero_struct
>
>
> Done.
>
>>
>>
>> - brig-lang.c:
>>   + In the long run I would like to get rid of
>>       opts->x_flag_whole_program = 0 in
>>     brig_langhook_init_options_struct, when did it cause issues, when
>>     you tried LTO?  Since there obviously is no linker-plugin support,
>>     I think we can leave it this way for now, though.
>
>
> Agreed. I have not tried the current status of LTO, but it can be implemented
> later.
>
>
>>
>>   + brig_langhook_handle_option has argument scode marked as unused
>>     but it is used.
>
>
> Fixed.
>
>>
>>   + brig_langhook_type_for_size uses both supposedly unused arguments
>>     and I am surprised that handling just 64 bits is sufficient.
>
>
> It is now being called for 32b too due to introducing the builtins like
> they should.
>
>>
>>   + brig_langhook_type_for_mode: the "FIXME: This static_cast should
>>     be in machmode.h" can be removed, the cast is in machmode.h
>>
>>   + brig_langhook_eh_personality comment refers to file
>>     libbrig/runtime/brig-unwind.c which does not seem to exist?
>>   + convert has attributes marked as unused but they are used
>
>
> Fixed these.
>
>>
>>   + The "FIXME: This is a hack to preserve trees that we create from
>>     the garbage collector." IMHO does not describe any real issue,
>>     using GTY roots for that is common practice.
>
>
> Removed the FIXME.
>
>> - brigspec.c:
>>   + lang_specific_driver: if (len > 3 && strcmp (arg + len - 3,
>>     ".brig") == 0) can never be true, even if str end with brig.
>>     Consequently, the if branch marked by FIXME later on in the
>>     function never gets executed.  So perhaps it is not necessary?
>
>
> True. A copy-paste error.
>>
>>
>> - brigfrontend/*.cc in general:
>>
>>   + A lot of functions should have a comment.  I prefer to have them
>>     above the function body but if it is a method, a comment in the
>>     class definition is fin e too (I think).  Often you have helpful
>>     comments inside the function but it really helps if you know what
>>     to expect before you start reading the function.  For example,
>>     brig_to_generic::add_global_variable needs a comment that it adds
>>     VAR_DECL to the list of global variables and if there is a "host
>>     def var" (I guess I know what that means but an explanation
>>     somewhere would not hurt either), it makes sure it points to the
>>     new VAR_DECL.  Another example: call_builtin is very difficult to
>>     review without a comment explaining what arguments it expects.
>>     Please make sure that all functions have a comment somewhere,
>>     perhaps with the exception of only the most trivial and
>>     self-evident.
>
>
> Fixed these. I also scanned the sources and added new comments
> where e.g. the function name didn't describe the purpose in a self clear
> way.
>
>
>>
>>   + Is there any reason why you use internal_error instead of
>>     more common gcc_assert and/or gcc_unreachable?
>
>
> I think it was because of the possibility to add a format str & a message
> more easily while developing. I now converted them to asserts/unreachable
> as the frontend can be considered feature complete.
>
>
>>
>> - brigfrontend/brig_to_generic.cc:
>>
>>   + Why does this filename have underscores while all the others have
>>     dashes? :-)
>
>
> Renamed.
>
>>
>>   + What should the sanity check of data secion in parse accomplish?
>
>
> Nothing anymore. A leftover from debugging sessions, I believe.
> Removed.
>
>>   + In build_reinterpret_cast, it would be best if you could avoid
>>     constructing VIEW_CONVERT_EXPRs that have type with a different
>>     size from the type of its operand (even though I think that Ada
>>     also does this, it is considered unfortunate).  What are the cases
>>     when this happens?
>
>
> This was needed due to the special treatment of f16 which is stored in
> a 32b reg (variable). I added a comment about this.
>
>>
>>     OK, adding another note later: For converting scalars (anything
>>     !AGGREGATE_TYPE_P), I think you pretty much always want to use
>>     NOP_EXPR rather than generating a V_C_E.  V_C_E is mainly used to
>>     change how we interpret aggregates (or type-cast between
>>     aggregates and scalars).  In particular, NOP_EXPR will also
>>     sign-extend properly when you are extending intergers according to
>>     the type, whereas what will be in the "extended" part of a V_C_E
>>     is basically undefined.
>
>
> I use VCE heavily on purpose in many places because of the untyped HSAIL
> register variables (represented as unsigned integer local variables) of which
> contents are treated as different types depending on the HSAIL opcode.
> The integer (extending) casts are done with separate HSAIL instructions.
> I don't want to sign extend unless explicitly stated so.
>
>>
>>   + in brig_to_generic::append_group_variable, I think you should not
>>     add align_padding to m_next_group_offset twice.  You do not do
>>     that in append_private_variable.
>
>
> Good catch. Fixed.
>
>>
>>
>>   + Remove the commented out debug_function in
>>     brig_to_generic::finish_function.
>
>
> I put it inside #if 0 ... #endif instead as it's a very useful snippet
> to have handy when
> debugging the output.
>
>>   + call_builtin - difficult to review without a comment explaining
>>     the parameters.  Apart from that, I really wonder why you go
>>     through the hoops of identifying builtins by names and caching
>>     them.  I believe you should be able to use builtin_decl_explicit
>>     to get the decl for the builtin code. Or am I wrong?
>
>
> Converted to use the standard way of importing builtins.def.
> I mimicked lto-lang.c.
>
>>
>> - brigfrontend/brig-code-entry-handler.cc:
>>
>>   + I don't know, maybe it is standard C++ practice, but putting
>>     whole-front-end initialization (built-in creation) to a
>>     constructor of an abstract ancestor of streaming class seems a bit
>>     unfortunate to me.
>
>
> This is now reduced to initialization of the builtin index map from the
> hsail-builtin.defs and the actual builtins are initialized in brig-lang.c.
>
>>
>>   + Speaking about built-ins.  I know that GO FE creates them like you
>>     do, but I wonder whether following how c-family/c-common.c creates
>>     them would not be better, at least for those builtins that are in
>>     builtins.def and files included from it.  That way you also get
>>     proper function attributes without copying them over, for example.
>>     However, is is entirely possible there is a reason to do it
>>     your/Go way, I was just surprised.
>
>
> Moved all builtins HSAIL use to hsail-builtins.def.
>
>>     You should probably also go forward with the TODO and make the
>>     add_custom_builtin calls into normal gcc builtins, otherwise LTO
>>     will not work with BRIG.
>
>
> Done.
>
>>   + brig_code_entry_handler::build_tree_operand: Please make it just
>>     one switch, rather than two if's followed by a switch, all of them
>>     based on the same field.
>
>
> Done.
>
>>
>>   + brig_code_entry_handler::build_address_operand: I think that
>>
>>         gcc_assert (arg_symbol->base.kind == BRIG_KIND_DIRECTIVE_VARIABLE);
>>
>>     checks for input error, rather than internal compiler error, and
>>     so if the symbol is not a symbol, you should call error() and bail
>>     out instead.  I think that given the nature of brig - there is
>>     little point in trying to continue parsing after an error -
>>     terminating the executable would be fine too.
>
>
> Makes sense. Removed the assert.
>
>>
>>     Also, in the calculation of the symbol_base for private segment
>>     symbols, I bet the third call to expand_or_call_builtin:
>>
>>           local_size
>>             = build2 (MULT_EXPR, uint32_type_node,
>>                       expand_or_call_builtin (BRIG_OPCODE_WORKGROUPSIZE,
>>                                               BRIG_TYPE_U32, uint32_type_node,
>>                                               uint32_1),
>>                       local_size);
>>
>>     should have uint32_2 as its last argument to get the 3rd dimension
>>     of the grid.
>
>
> Yes, this was already fixed recently.
>
>>     How come that the "segment == BRIG_SEGMENT_ARG" is the only case
>>     in which you have to handle arrays?
>
>
> Added this comment there to clarify it:
>
>        /* Two different type of array references in case of arguments
> depending where they are referred at.  In the caller (argument
> segment), the reference is to an array object and
> in the callee, the array object has been passed as a pointer
> to the array object.  */
>
> For the other segments, we handle array refs via addressing the first
> element in which case it doesn't differ from "scalar" variables.
>
>>     It also seems that if the address is from a KERNARG segment but
>>     also has a register component, you will overwrite the kernel
>>     base stored to ptr_base when dealing with the register.
>
>
>  Good catch. Fixed and added a test case.
>>
>>
>>     The code processing the register value should be done differently,
>>     I'm afraid.  First and foremost, you should not be using
>>     VIEW_CONVERT_EXPR (generated by build_reinterpret_cast) to
>>     sign-extend offsets, you should use NOP_EXPR for that.  I also do
>>
>>     not think there is any need to be constructing build_pointer_type
>>     (char_type_node) all the time.  GIMPLE/GENERIC is not C, you can
>>     use any pointer, for example ptr_type_node.
>
>
> Thanks for the simplification tips. I converted this part to pretty much a call
> to convert_to_pointer().
>
>>
>>     When you add pointer and offsets, you should be using
>>     POINTER_PLUS_EXPR rather than just PLUS_EXPR.
>
>
> Fixed. For some reason I thought POINTER_PLUS_EXPR requires a constant
> integer offset.
>
>>
>>     Finally, if you want to type-cast the final address to the type
>>     specified by the instruction, again use NOP_EXPR.  However, I
>>     don't think it is really necessary, in the middle-end, it is the
>>     type of the loads and stores that matter, not really the used
>>     pointer.
>
>
> Not sure of this. Isn't the mem access' size&alignment dictated by the
> pointer's type? At least that's the impression I get from MEM_REF's
> comment.
>
>>
>>   + brig_code_entry_handler::get_tree_expr_type_for_hsa_type: Needs a
>>     comment.  Why do we need it, in what way is it different than the
>>     previous function?  It special-cases F16 vectors, but differently,
>>     so which function should be used in which situation?
>
>
> Improved the comment.
>
>>
>>   + brig_code_entry_handler::add_temp_var: Seems like he coment is
>>     wrong, the assignment is appended to the current function but not
>>     returned.
>
>
> Fixed. It should have returned it, and gcc's default behavior of
> returning the last expression came into play, I think.
>
>>   + brig_code_entry_handler::unpack: Please use BITS_PER_UNIT to refer
>>     to the number of bits in a byte instead of using the number 8
>>     directly.
>
>
> Fixed.
>
>>   + brig_code_entry_handler::vbuild_builtin: A comment would help
>>     greatly.  Moreover, it seems weird that you are building an
>>     arbitrary(?)  type for a builtin, why don't you get it from the
>>     decl?
>
>
> This method is not needed anymore, thanks to the builtin rework.
>
>>
>>   + brig_code_entry_handler::build_operands: Please use
>>     BRIG_TYPE_BASE_MASK instead of the 0x01f constant when masking
>>     types.
>
>
> Fixed, also elsewhere.
>
>>
>>     The need to always encapsulate constant(?) operands in a V_C_E is
>>     very strange and I really think we need to figure out what is
>>     going on.
>
>
> I implemented the FE originally on an earlier gcc version and added
> some workarounds
> such as this, hoping that the issues were fixed in the later versions.
>
> Seems this workaround is not needed anymore with gcc trunk, removed...
>
>>
>>
>>   + brig_code_entry_handler::build_output_assignment: Again, Please
>>     use BRIG_TYPE_BASE_MASK instead of the 0x01f and BITS_PER_UNIT
>>     instead of 8.  The most worisome, however, is:
>>
>>
>>           if (CONVERT_EXPR_P (inst_expr) && POINTER_TYPE_P (inst_expr))
>>             {
>>               // convert_to_integer crashes when converting a view convert
>>               // expr to a pointer.  First cast it to a large enough int
>>               // and let the next integer conversion do the clipping.
>>               inst_expr = convert_to_integer (size_type_node, inst_expr);
>>             }
>>
>>     First of all, the above should not help, because V_C_E is not a
>>     CONVERT_EXPR_P.  Mainly, however, this should either be reported
>>     as a bug and fixed or probably avoided by not creating so many
>>     V_C_Es in the first place.
>
>
> ...ditto.
>
>> - brigfrontend/brig-atomic-inst-handler.cc: generate_tree - I have not
>>   read this file in much detail mainly because I'm still not convinced
>>   that organizing builtins based on their name strings is a good idea.
>
>
> Reworked.
>
>>   However, I'd like alto to point out that you should try to avoid
>>   building trees if you are not going to use them, especially if it is
>>   really simple like for example mem_ref in this function, because it
>>   strains the garbage collector for no reason.
>
>
> Fixed.
>
>>
>> - brig-basic-inst-handler.cc, operator():
>>
>>   if (brig_inst->opcode == BRIG_OPCODE_NOP)
>>     {
>>       return base->byteCount;
>>     }
>>
>>   tere should be no braces when there is only one statement in a
>>   branch (and there is no potential confusion about elses).
>
>
> Fixed.
>
>>
>>   Again, please do not use 0x01F to mask brug type base, use
>>   BRIG_TYPE_BASE_MASK.  Uou can also use BRIG_TYPE_PACK_MASK instead
>>   of or'ing all the pack values.
>
>
> Fixed.
>
> Attached an updated patch. Also the other patches got touched a bit, I attach
> them to the respective threads.
>
> Thanks again,
> Pekka

Attachment: 002-brig-fe-gcc.patch.gz
Description: GNU Zip compressed data

Attachment: 005-diff-to-previous.patch.gz
Description: GNU Zip compressed data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]