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]

[PATCH][Aarch64] Relational compare zero not merged into subtract


This patch improves code generation for relational compares against zero that are not merged into a subtract instruction. This patch improves the >= and < cases.

An example of the '<' case:

int lt (int x, int y)
{
  if ((x - y) < 0)
    return 10;

  return 0;
}

Trunk generates:

lt:
	sub	w1, w0, w1
	mov	w0, 10
	cmp	w1, 0
	csel	w0, w0, wzr, lt
	ret

With the patch we can eliminate the redundant subtract and now generate:

lt:
	cmp	w0, w1
	mov	w0, 10
	csel	w0, w0, wzr, mi
	ret

Bootstrapped and tested on aarch64-linux-gnu. Okay for trunk?

2017-06-01  Michael Collison  <michael.collison@arm.com>

	* config/aarch64/aarch64-simd.md(aarch64_sub<mode>_compare0):
	New pattern.
	* testsuite/gcc.target/aarch64/cmp-2.c: New testcase.

Attachment: pr7261.patch.patch
Description: pr7261.patch.patch


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