https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113091
--- Comment #7 from Feng Xue <fxue at os dot amperecomputing.com> --- > The issue here is that because the "outer" pattern consumes > patt_64 = (int) patt_63 it should have adjusted _2 = (int) _1 > stmt-to-vectorize > as being the outer pattern root stmt for all this logic to work correctly. We could not simply make this adjustment since pattern recognition does not require replaced SSA to be of single-use. If we change the above case to attach another scalar use to "_2" as: int foo(char *a, char *b) { unsigned array[8]; int a0 = a[0]; // _2 = (int) _1; array[0] = (a0 - b[0]); array[1] = (a[1] - b[1]); array[2] = (a[2] - b[2]); array[3] = (a[3] - b[3]); array[4] = (a[4] - b[4]); array[5] = (a[5] - b[5]); array[6] = (a[6] - b[6]); array[7] = (a[7] - b[7]); return test(array) + a0; } The pattern statement "patt_64 = (int) patt_63" for "_2 = (int) _1" should be kept. So we also need the check of "identifying whether a scalar stmt takes part in vectorization or not" to ensure the adjustment is doable.