> > As things stand now, if "predicable" is set to "no" for a > particular > > alternative, the value of control_attr is irrelevant, that > alternative > > will never have a cond_exec version. In your scheme, however, > > the presence of <subst_predicated> triggers the creation of > cond_exec > > variants for all of the alternatives, even the ones that we don't > want > > to cond_exec. > Well, that's not quite right. Internally, define_cond_exec works > pretty similar to define_subst. It can't be applied to one > alternative > and not applied to another - it works on the entire pattern. What > it > does to distinguish alternatives basing on 'predicable' attribute > is > to properly set attribute 'ce_enabled'.
Fair enough. What I meant is that conceptually, it's like there doesn't exist a cond_exec variant when "predicable" is set to "no". > > Here is a small example (you could try it yourself by invoking > genmddump which is located in build directory): > -----EXAMPLE 1----- > (define_attr "predicable" "no,yes" (const_string "no")) > (define_insn "aaa" > [(set (match_operand:SI 0 "register_operand" "=r,m,x") > (match_operand:SI 1 "register_operand" "r,m,x"))] > "" > "add %0 %1" > [(set_attr "predicable" "yes,no,yes")]) > > (define_cond_exec > [(match_operator 0 "arm_comparison_operator" > [(match_operand 1 "cc_register" "") > (const_int 0)])] > "TARGET_32BIT" > "") > ----- END OF EXAMPLE 1----- > > And here is what the compiler has after expanding all patterns (it > is > output of genmddump): > ;; built-in: -1 > (define_attr ("nonce_enabled") ("no,yes") (const_string ("yes"))) > ;; built-in: -1 > (define_attr ("ce_enabled") ("no,yes") (const_string ("yes"))) > ;; a.md: 1 > (define_attr ("predicable") ("no,yes") (const_string ("no"))) > ;; a.md: 3 > (define_insn ("aaa") > [ (set (match_operand:SI 0 ("register_operand") ("=r,m,x")) > (match_operand:SI 1 ("register_operand") ("r,m,x"))) > ] ("") ("add %0 %1") > [ (set_attr ("predicable") ("yes,no,yes")) ]) > > ;; a.md: 3 > (define_insn ("*p aaa") > [ (cond_exec (match_operator 2 ("arm_comparison_operator") > [(match_operand 3 ("cc_register") ("")) > (const_int 0 [0]) ]) > (set (match_operand:SI 0 ("register_operand") > ("=r,m,x")) > (match_operand:SI 1 ("register_operand") > ("r,m,x")))) > ] ("TARGET_32BIT") ("add %0 %1") > [ (set_attr ("ce_enabled") ("yes,no,yes")) ]) > > As you might see, it doesn't distinguish alternatives at all - it > just > fills 'ce_enabled' attribute with proper values. > Here is a second example, which is actually pretty similar to the > first one, but it's done with define_subst: > -----EXAMPLE 2----- > (define_subst_attr "at" "ce_subst" "yes" "no") > > (define_insn "aaa" > [(set (match_operand:SI 0 "register_operand" "=r,m,x") > (match_operand:SI 1 "register_operand" "r,m,x"))] > "" > "add %0 %1" > [(set_attr "ce_enabled" "yes,<at>,yes")]) Isn't ce_enabled an internal, implicit attribute? I don't think it was meant to be directly manipulated by the MD patterns. It seems like a hack around the canonical mechanism we have for defining conditional execution (by way of the "predicable" attribute). Presumably, in order to disable the cond_exec variant dynamically (alternative 3 in your example) I'd have to add: (define_subst_attr "subst_predicated" "ce_subst" "no" "yes") and then in the "aaa" define_insn add: (set_attr "predicated" "<subst_predicated>") (set_attr "control_attr" "yes,yes,no") and manipulate the "enabled" rules considering the dynamic condition, "predicated" and "control_attr". This has the disadvantages of: - Having to copy (set_attr "predicated" "<subst_predicated>") in all patterns that are predicable. - Using the internal ce_enabled attribute instead of the canonical "predicable". - Still doesn't work for define_insn_and_split ;) > > (define_subst "ce_subst" > [(match_operand 0)] > "TARGET_32BIT" > [(cond_exec (match_operator 1 "arm_comparison_operator" > [(match_operand 2 "cc_register" "") > (const_int 0)]) > (match_dup 0))]) > -----END OF EXAMPLE 2----- > > Here is what compiler has after expanding patterns: > ;; c.md: 1 > (define_attr ("ce_subst") ("no,yes") (const_string ("no"))) > ;; c.md: 3 > (define_insn ("aaa") > [ (set (match_operand:SI 0 ("register_operand") ("=r,m,x")) > (match_operand:SI 1 ("register_operand") ("r,m,x"))) > ] ("") ("add %0 %1") > [ (set_attr ("ce_enabled") ("yes,yes,yes")) ]) > > ;; c.md: 3 > (define_insn ("aaa") > [(cond_exec (match_operator 2 ("arm_comparison_operator") > [(match_operand 3 ("cc_register") ("")) > (const_int 0 [0])]) > (set (match_operand:SI 0 ("register_operand") > ("=r,m,x")) > (match_operand:SI 1 ("register_operand") > ("r,m,x")))) > ] ("TARGET_32BIT") ("add %0 %1") > [(set_attr ("ce_enabled") ("yes,no,yes")) > (set_attr ("ce_subst") ("no")) ]) > > You might notice that the output is almost the same (actually, all > differences could be eliminated except adding new attribute by > subst > to substed-pattern). So currently I don't see why define_subst > can't > by used instead of define_cond_exec in your case. I agree that it is possible to use define_subst (apart from the fact that it doesn't support define_insn_and_split yet). It's just that I think it looks hacky and makes the patterns look less readable if the reader has to remember that predication is implicit when a subst_attr is encountered that is tied to that particular define_subst. This will be exacerbated even further if we decide to use other instances of define_subst for other purposes. The reader would need to track down the define_subst corresponding to the subst_attr he/she encountered to figure out whether it's the ce_subst one. Contrast this with just using "predicable" which is known and documented to create a cond_exec variant. > > Hope these examples could help. Thanks, Kyrill > > Thanks, Michael > > On 24 May 2013 15:39, Kyrylo Tkachov <kyrylo.tkac...@arm.com> > wrote: > >> > Unfortunately, that is a strong point against define_subst in > my > >> case, > >> > since on arm we have more than 400 predicable patterns, of we > >> which we > >> > might want to modify dozens to perform this cond_exec > >> restriction. > >> > And creating custom subst-attributes for each one would really > >> make > >> > things hard to manage/maintain. > >> That's definitely a reason:) > >> > >> > With my proposed modification to define_cond_exec, if we want > to > >> > restrict the cond_exec variant in the way I described, we only > >> add > >> > another set_attr to a pattern, without > >> > moving around their constraint strings. > >> > > >> > I'm not sure I see how define_subst could be modified to allow > >> for this > >> > functionality without impacting the current readability of the > md > >> > patterns (not to mention the semantics of define_subst > itself). > >> > >> Let me check my understanding of your solution. You suggest to > add > >> (set_attr "control_var" "yes,no") > >> to every define_insn in which we want to disable second > alternative > >> in > >> predicated pattern, right? > > > > Crucially, I want to disable the second alternative in the > predicated > > pattern on a non-static condition (i.e. a flag, I used > > TARGET_RESTRICT_CE in previous examples) > > > >> Then, when cond_exec has processed the initial pattern, we get > two > >> patterns: in the first one (not-predicated) we have 'predicated' > >> attribute set to its default value 'no' and in the second > pattern > >> (predicated) this attribute is set to 'yes'. Basing on this, > >> 'enabled' > >> is computed for each pattern. It equals 'yes,yes' for the first > one > >> and 'yes,no' for the second one. > >> So, what you need is to have an attribute to distinguish > predicated > >> pattern from not-predicated one, correct? > > > > Yes, that's right :) > > > >> > >> If that vision is correct, it could be easily done with > >> define_subst > >> (and without tons of new subst-attributes, as I suggested > before:) > >> ): > >> Just add one subst attribute > >> (define_subst_attr "subst_predicated" "ds_predicable" "no" > "yes") > >> and add it to define_insn pattern: > >> (define_insn ... > >> [(set_attr "predicable" "yes") > >> (set_attr "control_attr" "yes,<subst_predicated>")]) > > > > So, "predicable" only has some implicit meaning when > define_cond_exec is > > used, so we might as well remove that (set_attr "predicable" ...) > if we > > are going to replace define_cond_exec with a define_subst. > > > >> I think that'll do the trick. > > > > Almost, there is one problem however. What if I want the second > > alternative to never be predicated? > > The purpose of control_attr in my scheme is to disable the > cond_exec > > version when a particular flag is set (I used TARGET_RESTRICT_CE > as an > > example earlier in this thread), not to disable predication of > > that alternative forever, that's what "predicable" is for. > > > > As things stand now, if "predicable" is set to "no" for a > particular > > alternative, the value of control_attr is irrelevant, that > alternative > > will never have a cond_exec version. In your scheme, however, > > the presence of <subst_predicated> triggers the creation of > cond_exec > > variants for all of the alternatives, even the ones that we don't > want > > to cond_exec. > > > > Another variant of your suggestion would be: > > [(set_attr "predicated" "<subst_predicated>") > > (set_attr "control_attr" "yes,no")]) > > > > which would set "predicated" to "yes" in the cond_exec version > and "no" > > in the original, thus distinguishing between them. control_attr > would > > then be used in the definition of "enabled" to disable the > > cond_exec version when a certain flag is set. This is what I > want, but > > again there's a problem with non-predicable alternatives. > > What if I also had a 3rd alternative that was not predicable at > all? > > (set_attr "predicable" "yes,yes,no"). > > The presence of <subst_predicated> would force the creation of a > > cond_exec variant for that alternative and disabling that would > require > > another attribute like this: > > > > [(set_attr "predicated" "<subst_predicated>") > > (set_attr "control_attr" "yes,no,no") <<< 3rd value is > irrelevant > > (set_attr "predicable_valid" "yes,yes,no")]) > > > > and an extra rule in "enabled" that disables an alternative when > > "predicated" is "yes" and "predicable_valid" is "no", which again > adds > > lots of superfluous churn to the md patterns. > > > > (Sorry if this is a bit of a ramble, I'm just trying to find a > solution > > that will have the least impact on the md patterns :) ) > > Thanks, > > Kyrill > > > >> > >> Everything else is remaining as you suggested (I mean proper use > of > >> 'control_attr' in 'enabled' attribute). > >> > >> > >> > Thanks, > >> > Kyrill > >> Thanks, Michael > >> > >> > > > > -- > --- > Best regards, > Michael V. Zolotukhin, > Software Engineer > Intel Corporation.