https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101105
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC|rguenther at suse dot de |rguenth at gcc dot gnu.org, | |rsandifo at gcc dot gnu.org Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2021-06-17 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. short a; int b[5][4] = {2, 2}; int d; short e(int f) { return f == 0 || a && f == 1 ? 0 : a; } int main() { int g, h; g = 3; for (; g >= 0; g--) { h = 3; for (; h >= 0; h--) b[g][h] = b[0][1] && e(1); } d = b[0][1]; if (d != 0) __builtin_abort (); return 0; } after if-conversion we have <bb 3> [local count: 214748368]: # g_40 = PHI <g_11(7), 3(2)> # ivtmp_2 = PHI <ivtmp_27(7), 4(2)> b[g_40][2] = 0; b[g_40][3] = 0; b[g_40][1] = 0; _42 = b[0][1]; b[g_40][0] = 0; g_11 = g_40 + -1; ivtmp_27 = ivtmp_2 - 1; if (ivtmp_27 != 0) goto <bb 7>; [75.00%] else goto <bb 4>; [25.00%] <bb 7> [local count: 161061274]: goto <bb 3>; [100.00%] <bb 4> [local count: 53687093]: # _18 = PHI <_42(3)> d = _18; if (_18 != 0) and vect produces <bb 3> [local count: 214748368]: # g_40 = PHI <g_11(7), 3(2)> # ivtmp_2 = PHI <ivtmp_27(7), 4(2)> # ivtmp_48 = PHI <ivtmp_26(7), _19(2)> # ivtmp_32 = PHI <ivtmp_12(7), 0(2)> _42 = b[0][1]; MEM <vector(4) int> [(int *)ivtmp_48] = { 0, 0, 0, 0 }; ivtmp_31 = ivtmp_48 + 18446744073709551600(OVF); g_11 = g_40 + -1; ivtmp_27 = ivtmp_2 - 1; ivtmp_26 = ivtmp_48 + 18446744073709551600(OVF); ivtmp_12 = ivtmp_32 + 1; if (ivtmp_12 < 4) goto <bb 7>; [75.00%] else goto <bb 4>; [25.00%] <bb 7> [local count: 161061274]: goto <bb 3>; [100.00%] <bb 4> [local count: 53687093]: # _18 = PHI <_42(3)> We have (Data Dep: #(Data Ref: # bb: 3 # stmt: b[g_40][1] = 0; # ref: b[g_40][1]; # base_object: b; # Access function 0: 1 # Access function 1: {3, +, -1}_1 #) #(Data Ref: # bb: 3 # stmt: _42 = b[0][1]; # ref: b[0][1]; # base_object: b; # Access function 0: 1 # Access function 1: 0 #) access_fn_A: 1 access_fn_B: 1 (subscript iterations_that_access_an_element_twice_in_A: [0] last_conflict: scev_not_known iterations_that_access_an_element_twice_in_B: [0] last_conflict: scev_not_known (Subscript distance: 0 )) access_fn_A: {3, +, -1}_1 access_fn_B: 0 (subscript iterations_that_access_an_element_twice_in_A: [-3] last_conflict: 1 iterations_that_access_an_element_twice_in_B: [0] last_conflict: 1 (Subscript distance: -3 )) loop nest: (1 ) ) and mark the DR for a runtime alias test. But then t3.c:8:12: note: === vect_prune_runtime_alias_test_list === t3.c:8:12: note: can tell at compile time that b[g_40][0] and b[0][1] do not alias t3.c:8:12: note: improved number of alias checks from 1 to 0 as vect_compile_time_alias gets segment_lengths of zero (huh), since /* Step values are irrelevant for aliasing if the number of vector iterations is equal to the number of scalar iterations (which can happen for fully-SLP loops). */ bool ignore_step_p = known_eq (LOOP_VINFO_VECT_FACTOR (loop_vinfo), 1U); ... if (ignore_step_p) { segment_length_a = size_zero_node; segment_length_b = size_zero_node; } but I'm not sure if a segment length of zero will do good in any case where the alias check is needed? Richard - that's your code, can you have a look?