https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107209
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2022-10-11 Status|UNCONFIRMED |NEW --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Richard Biener from comment #1) > Looks like EVRP elimination fails to clean EH? Or target folding. Would be > nice to have a testcase not requiring aarch64 intrinsics. I tried but didn't crash. ``` #define vector __attribute__((vector_size(sizeof(double)))) vector double foo1 (void) { double v1 = 3.14159265359; double v2 = 1.383894; double vec_1_data[] = {v1}; double vec_2_data[] = {v2}; vector double vec_1 = {vec_1_data[0]}; vector double vec_2 = {vec_2_data[0]}; return vec_1*vec_2; } ``` Before evrp on the working testcase: ``` vec_1_data$0_3 = 3.14159265359000006156975359772332012653350830078125e+0; vec_2_data$0_4 = 1.3838939999999999574953335468308068811893463134765625e+0; _1 = vec_1_data$0_3; vec_1_9 = {_1}; _2 = vec_2_data$0_4; vec_2_11 = {_2}; [LP 1] _12 = vec_1_9 * vec_2_11; ``` But with the aarch64 intrinsics: vec_1_data$0_2 = 3.14159265359000006156975359772332012653350830078125e+0; vec_2_data$0_3 = 1.3838939999999999574953335468308068811893463134765625e+0; _10 = vec_1_data$0_2; _7 = {_10}; _20 = vec_2_data$0_3; _21 = {_20}; [LP 1] # .MEM_28 = VDEF <.MEM_4(D)> # USE = nonlocal escaped # CLB = nonlocal escaped _24 = __builtin_aarch64_fmulxdf (_10, _20); ``` aarch64_general_gimple_fold_builtin inside aarch64-builtins.cc which does the folding and it looks correct. `BUILTIN_GPF (BINOP, fmulx, 0, ALL)` So it requires aarch64 intrinsics. In GCC 12, the folding of fmulxdf or the multiply didn't happen during evrp even.