ipa-bit-cp: Fix adjusting value according to mask (PR119803)

In my fix for PR 119318 I put mask calculation in
ipcp_bits_lattice::meet_with_1 above a final fix to value so that all
the bits in the value which are meaningless according to mask have
value zero, which has tripped a validator in PR 119803.  This patch
fixes that by moving the adjustment down.

Even thought the fix for PR 119318 did a similar thing in
ipcp_bits_lattice::meet_with, the same is not necessary because that
code path then feeds the new value and mask to
ipcp_bits_lattice::set_to_constant which does the final adjustment
correctly.

In both places, however, Jakup proposed a better way of calculating
cap_mask and so I have changed it accordingly.

gcc/ChangeLog:

2025-04-15  Martin Jambor  <mjambor@suse.cz>

	PR ipa/119803
	* ipa-cp.cc (ipcp_bits_lattice::meet_with_1): Move m_value adjustmed
	according to m_mask below the adjustment of the latter according to
	cap_mask.  Optimize the  calculation of cap_mask a bit.
	(ipcp_bits_lattice::meet_with): Optimize the calculation of cap_mask a
	bit.

gcc/testsuite/ChangeLog:

2025-04-15  Martin Jambor  <mjambor@suse.cz>

	PR ipa/119803
	* gcc.dg/ipa/pr119803.c: New test.

Co-authored-by: Jakub Jelinek <jakub@redhat.com>
This commit is contained in:
Martin Jambor 2025-04-15 15:55:34 +02:00 committed by Martin Jambor
parent 074b2b0f91
commit b4cf69503b
No known key found for this signature in database
GPG key ID: BF63C1BC3FA43540
2 changed files with 19 additions and 3 deletions

View file

@ -933,13 +933,13 @@ ipcp_bits_lattice::meet_with_1 (widest_int value, widest_int mask,
m_mask = (m_mask | mask) | (m_value ^ value);
if (drop_all_ones)
m_mask |= m_value;
m_value &= ~m_mask;
widest_int cap_mask = wi::bit_not (wi::sub (wi::lshift (1, precision), 1));
widest_int cap_mask = wi::shifted_mask <widest_int> (0, precision, true);
m_mask |= cap_mask;
if (wi::sext (m_mask, precision) == -1)
return set_to_bottom ();
m_value &= ~m_mask;
return m_mask != old_mask;
}
@ -1015,7 +1015,7 @@ ipcp_bits_lattice::meet_with (ipcp_bits_lattice& other, unsigned precision,
adjusted_mask |= adjusted_value;
adjusted_value &= ~adjusted_mask;
}
widest_int cap_mask = wi::bit_not (wi::sub (wi::lshift (1, precision), 1));
widest_int cap_mask = wi::shifted_mask <widest_int> (0, precision, true);
adjusted_mask |= cap_mask;
if (wi::sext (adjusted_mask, precision) == -1)
return set_to_bottom ();

View file

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
extern void f(int p);
int a, b;
char c;
static int d(int e) { return !e || a == 1 ? 0 : a / e; }
static void h(short e) {
int g = d(e);
f(g);
}
void i() {
c = 128;
h(c);
b = d(65536);
}