Re: [PATCH 5/8] [RS6000] rs6000_rtx_costs cost IOR
On Mon, Jan 25, 2021 at 04:51:43PM -0600, Segher Boessenkool wrote: > Hi! > > On Thu, Oct 08, 2020 at 09:27:57AM +1030, Alan Modra wrote: > > * config/rs6000/rs6000.c (rotate_insert_cost): New function. > > (rs6000_rtx_costs): Cost IOR. > > > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > > index 383d2901c9f..15a806fe307 100644 > > --- a/gcc/config/rs6000/rs6000.c > > +++ b/gcc/config/rs6000/rs6000.c > > @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) > > && get_attr_cannot_copy (insn); > > } > > > > +/* Handle rtx_costs for scalar integer rotate and insert insns. */ > > You need to document here what the return value means, and what the > preconditions for "left" (and "right") are. Done, and I moved the preconditions on "left" into the new function. > > +static bool > > +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, > > + int *total) > > +{ > > + if (GET_CODE (right) == AND > > ... because you never check the CODE of "left". > > > + && CONST_INT_P (XEXP (right, 1)) > > + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) > > HOST_WIDE_INT is always exactly 64 bits now, so you could do "== -1". Yes, but this is exactly the way the expression occurs in rotl*_insert* instruction patterns. I think it's better to keep them the same. > > +{ > > + rtx leftop = XEXP (left, 0); > > + rtx rightop = XEXP (right, 0); > > + > > + /* rotlsi3_insert_5. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == SImode > > + && UINTVAL (XEXP (left, 1)) != 0 > > + && UINTVAL (XEXP (right, 1)) != 0 > > + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) > > + return true; > > Empty line after return please. Done, here and elsewhere. > > + /* rotldi3_insert_6. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) > > + return true; > > + /* rotldi3_insert_7. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) > > + return true; > > Those could just use rs6000_is_valid_mask as well? This is taken straight from rotldi3_insert_7, so it really ought to stay that way. > > Please wait this until stage 1. Sorry. OK, I'll leave all the rs6000_rtx_costs changes until then. -- Alan Modra Australia Development Lab, IBM
Re: [PATCH 5/8] [RS6000] rs6000_rtx_costs cost IOR
Hi! On Thu, Oct 08, 2020 at 09:27:57AM +1030, Alan Modra wrote: > * config/rs6000/rs6000.c (rotate_insert_cost): New function. > (rs6000_rtx_costs): Cost IOR. > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > index 383d2901c9f..15a806fe307 100644 > --- a/gcc/config/rs6000/rs6000.c > +++ b/gcc/config/rs6000/rs6000.c > @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) >&& get_attr_cannot_copy (insn); > } > > +/* Handle rtx_costs for scalar integer rotate and insert insns. */ You need to document here what the return value means, and what the preconditions for "left" (and "right") are. > +static bool > +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, > + int *total) > +{ > + if (GET_CODE (right) == AND ... because you never check the CODE of "left". > + && CONST_INT_P (XEXP (right, 1)) > + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) HOST_WIDE_INT is always exactly 64 bits now, so you could do "== -1". > +{ > + rtx leftop = XEXP (left, 0); > + rtx rightop = XEXP (right, 0); > + > + /* rotlsi3_insert_5. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == SImode > + && UINTVAL (XEXP (left, 1)) != 0 > + && UINTVAL (XEXP (right, 1)) != 0 > + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) > + return true; Empty line after return please. > + /* rotldi3_insert_6. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == DImode > + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) > + return true; > + /* rotldi3_insert_7. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == DImode > + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) > + return true; Those could just use rs6000_is_valid_mask as well? > + rtx mask = 0; > + rtx shift = leftop; > + rtx_code shift_code = GET_CODE (shift); > + /* rotl3_insert. */ > + if (shift_code == ROTATE > + || shift_code == ASHIFT > + || shift_code == LSHIFTRT) > + mask = right; > + else > + { > + shift = rightop; > + shift_code = GET_CODE (shift); > + /* rotl3_insert_2. */ > + if (shift_code == ROTATE > + || shift_code == ASHIFT > + || shift_code == LSHIFTRT) > + mask = left; > + } > + if (mask > + && CONST_INT_P (XEXP (shift, 1)) > + && rs6000_is_valid_insert_mask (XEXP (mask, 1), shift, mode)) > + { > + *total += rtx_cost (XEXP (shift, 0), mode, shift_code, 0, speed); > + *total += rtx_cost (XEXP (mask, 0), mode, AND, 0, speed); > + return true; > + } > +} > + /* rotl3_insert_3. */ > + if (GET_CODE (right) == ASHIFT > + && CONST_INT_P (XEXP (right, 1)) > + && (INTVAL (XEXP (right, 1)) > + == exact_log2 (UINTVAL (XEXP (left, 1)) + 1))) > +{ > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > + *total += rtx_cost (XEXP (right, 0), mode, ASHIFT, 0, speed); > + return true; > +} > + /* rotl3_insert_4. */ > + if (GET_CODE (right) == LSHIFTRT > + && CONST_INT_P (XEXP (right, 1)) > + && mode == SImode > + && (INTVAL (XEXP (right, 1)) > + + exact_log2 (-UINTVAL (XEXP (left, 1 == 32) > +{ > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > + *total += rtx_cost (XEXP (right, 0), mode, LSHIFTRT, 0, speed); > + return true; > +} > + return false; > +} > + > /* Compute a (partial) cost for rtx X. Return true if the complete > cost has been computed, and false if subexpressions should be > scanned. In either case, *TOTAL contains the cost result. > @@ -21253,7 +21338,7 @@ static bool > rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > int opno ATTRIBUTE_UNUSED, int *total, bool speed) > { > - rtx right; > + rtx left, right; >int code = GET_CODE (x); > >switch (code) > @@ -21435,7 +21520,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > outer_code, >right = XEXP (x, 1); >if (CONST_INT_P (right)) > { > - rtx left = XEXP (x, 0); > + left = XEXP (x, 0); > rtx_code left_code = GET_CODE (left); > > /* rotate-and-mask: 1 insn. */ > @@ -21452,9 +21537,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > outer_code, >return false; > > case IOR: > - /* FIXME */ >*total = COSTS_N_INSNS (1); > - return true; > + left = XEXP (x, 0); > + if (GET_CODE (left) == AND > + && CONST_INT_P (XEXP (left, 1))) > + { > + right = XEXP (x, 1); > + if (rotate_insert_cost (left, right, mode, speed, total)) > + return true; > + } > + return false; > > case CLZ: > case XOR: Please wait this until stage 1. Sorry. Segher
Re: [PATCH 5/8] [RS6000] rs6000_rtx_costs cost IOR
Ping. On Tue, Jan 12, 2021 at 02:02:18PM +1030, Alan Modra wrote: > Ping > https://gcc.gnu.org/pipermail/gcc-patches/2020-October/555756.html > > On Thu, Oct 08, 2020 at 09:27:57AM +1030, Alan Modra wrote: > > * config/rs6000/rs6000.c (rotate_insert_cost): New function. > > (rs6000_rtx_costs): Cost IOR. > > > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > > index 383d2901c9f..15a806fe307 100644 > > --- a/gcc/config/rs6000/rs6000.c > > +++ b/gcc/config/rs6000/rs6000.c > > @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) > > && get_attr_cannot_copy (insn); > > } > > > > +/* Handle rtx_costs for scalar integer rotate and insert insns. */ > > + > > +static bool > > +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, > > + int *total) > > +{ > > + if (GET_CODE (right) == AND > > + && CONST_INT_P (XEXP (right, 1)) > > + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) > > +{ > > + rtx leftop = XEXP (left, 0); > > + rtx rightop = XEXP (right, 0); > > + > > + /* rotlsi3_insert_5. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == SImode > > + && UINTVAL (XEXP (left, 1)) != 0 > > + && UINTVAL (XEXP (right, 1)) != 0 > > + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) > > + return true; > > + /* rotldi3_insert_6. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) > > + return true; > > + /* rotldi3_insert_7. */ > > + if (REG_P (leftop) > > + && REG_P (rightop) > > + && mode == DImode > > + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) > > + return true; > > + > > + rtx mask = 0; > > + rtx shift = leftop; > > + rtx_code shift_code = GET_CODE (shift); > > + /* rotl3_insert. */ > > + if (shift_code == ROTATE > > + || shift_code == ASHIFT > > + || shift_code == LSHIFTRT) > > + mask = right; > > + else > > + { > > + shift = rightop; > > + shift_code = GET_CODE (shift); > > + /* rotl3_insert_2. */ > > + if (shift_code == ROTATE > > + || shift_code == ASHIFT > > + || shift_code == LSHIFTRT) > > + mask = left; > > + } > > + if (mask > > + && CONST_INT_P (XEXP (shift, 1)) > > + && rs6000_is_valid_insert_mask (XEXP (mask, 1), shift, mode)) > > + { > > + *total += rtx_cost (XEXP (shift, 0), mode, shift_code, 0, speed); > > + *total += rtx_cost (XEXP (mask, 0), mode, AND, 0, speed); > > + return true; > > + } > > +} > > + /* rotl3_insert_3. */ > > + if (GET_CODE (right) == ASHIFT > > + && CONST_INT_P (XEXP (right, 1)) > > + && (INTVAL (XEXP (right, 1)) > > + == exact_log2 (UINTVAL (XEXP (left, 1)) + 1))) > > +{ > > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > > + *total += rtx_cost (XEXP (right, 0), mode, ASHIFT, 0, speed); > > + return true; > > +} > > + /* rotl3_insert_4. */ > > + if (GET_CODE (right) == LSHIFTRT > > + && CONST_INT_P (XEXP (right, 1)) > > + && mode == SImode > > + && (INTVAL (XEXP (right, 1)) > > + + exact_log2 (-UINTVAL (XEXP (left, 1 == 32) > > +{ > > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > > + *total += rtx_cost (XEXP (right, 0), mode, LSHIFTRT, 0, speed); > > + return true; > > +} > > + return false; > > +} > > + > > /* Compute a (partial) cost for rtx X. Return true if the complete > > cost has been computed, and false if subexpressions should be > > scanned. In either case, *TOTAL contains the cost result. > > @@ -21253,7 +21338,7 @@ static bool > > rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > > int opno ATTRIBUTE_UNUSED, int *total, bool speed) > > { > > - rtx right; > > + rtx left, right; > >int code = GET_CODE (x); > > > >switch (code) > > @@ -21435,7 +21520,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > > outer_code, > >right = XEXP (x, 1); > >if (CONST_INT_P (right)) > > { > > - rtx left = XEXP (x, 0); > > + left = XEXP (x, 0); > > rtx_code left_code = GET_CODE (left); > > > > /* rotate-and-mask: 1 insn. */ > > @@ -21452,9 +21537,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int > > outer_code, > >return false; > > > > case IOR: > > - /* FIXME */ > >*total = COSTS_N_INSNS (1); > > - return true; > > + left = XEXP (x, 0); > > + if (GET_CODE (left) == AND > > + && CONST_INT_P (XEXP (left, 1))) > > + { > > + right = XEXP (x, 1); > > + if (rotate_insert_cost (left, right, mode, speed, total)) > > + return true; > > + } > > + return false; > > > > case CLZ: > > case XOR: -- Alan Modra Australia Development Lab, IBM
[PATCH 5/8] [RS6000] rs6000_rtx_costs cost IOR
* config/rs6000/rs6000.c (rotate_insert_cost): New function. (rs6000_rtx_costs): Cost IOR. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 383d2901c9f..15a806fe307 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) && get_attr_cannot_copy (insn); } +/* Handle rtx_costs for scalar integer rotate and insert insns. */ + +static bool +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, + int *total) +{ + if (GET_CODE (right) == AND + && CONST_INT_P (XEXP (right, 1)) + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) +{ + rtx leftop = XEXP (left, 0); + rtx rightop = XEXP (right, 0); + + /* rotlsi3_insert_5. */ + if (REG_P (leftop) + && REG_P (rightop) + && mode == SImode + && UINTVAL (XEXP (left, 1)) != 0 + && UINTVAL (XEXP (right, 1)) != 0 + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) + return true; + /* rotldi3_insert_6. */ + if (REG_P (leftop) + && REG_P (rightop) + && mode == DImode + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) + return true; + /* rotldi3_insert_7. */ + if (REG_P (leftop) + && REG_P (rightop) + && mode == DImode + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) + return true; + + rtx mask = 0; + rtx shift = leftop; + rtx_code shift_code = GET_CODE (shift); + /* rotl3_insert. */ + if (shift_code == ROTATE + || shift_code == ASHIFT + || shift_code == LSHIFTRT) + mask = right; + else + { + shift = rightop; + shift_code = GET_CODE (shift); + /* rotl3_insert_2. */ + if (shift_code == ROTATE + || shift_code == ASHIFT + || shift_code == LSHIFTRT) + mask = left; + } + if (mask + && CONST_INT_P (XEXP (shift, 1)) + && rs6000_is_valid_insert_mask (XEXP (mask, 1), shift, mode)) + { + *total += rtx_cost (XEXP (shift, 0), mode, shift_code, 0, speed); + *total += rtx_cost (XEXP (mask, 0), mode, AND, 0, speed); + return true; + } +} + /* rotl3_insert_3. */ + if (GET_CODE (right) == ASHIFT + && CONST_INT_P (XEXP (right, 1)) + && (INTVAL (XEXP (right, 1)) + == exact_log2 (UINTVAL (XEXP (left, 1)) + 1))) +{ + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); + *total += rtx_cost (XEXP (right, 0), mode, ASHIFT, 0, speed); + return true; +} + /* rotl3_insert_4. */ + if (GET_CODE (right) == LSHIFTRT + && CONST_INT_P (XEXP (right, 1)) + && mode == SImode + && (INTVAL (XEXP (right, 1)) + + exact_log2 (-UINTVAL (XEXP (left, 1 == 32) +{ + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); + *total += rtx_cost (XEXP (right, 0), mode, LSHIFTRT, 0, speed); + return true; +} + return false; +} + /* Compute a (partial) cost for rtx X. Return true if the complete cost has been computed, and false if subexpressions should be scanned. In either case, *TOTAL contains the cost result. @@ -21253,7 +21338,7 @@ static bool rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UNUSED, int *total, bool speed) { - rtx right; + rtx left, right; int code = GET_CODE (x); switch (code) @@ -21435,7 +21520,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, right = XEXP (x, 1); if (CONST_INT_P (right)) { - rtx left = XEXP (x, 0); + left = XEXP (x, 0); rtx_code left_code = GET_CODE (left); /* rotate-and-mask: 1 insn. */ @@ -21452,9 +21537,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, return false; case IOR: - /* FIXME */ *total = COSTS_N_INSNS (1); - return true; + left = XEXP (x, 0); + if (GET_CODE (left) == AND + && CONST_INT_P (XEXP (left, 1))) + { + right = XEXP (x, 1); + if (rotate_insert_cost (left, right, mode, speed, total)) + return true; + } + return false; case CLZ: case XOR: