Tested on SPARC/Solaris, applied on the mainline.
2011-10-04 Eric Botcazou <ebotca...@adacore.com> * config/sparc/sparc.c (sparc_fold_builtin): Use a sequence of tests. -- Eric Botcazou
Index: config/sparc/sparc.c =================================================================== --- config/sparc/sparc.c (revision 179488) +++ config/sparc/sparc.c (working copy) @@ -9716,24 +9716,23 @@ sparc_fold_builtin (tree fndecl, int n_a if (ignore) { - switch (icode) - { - case CODE_FOR_alignaddrsi_vis: - case CODE_FOR_alignaddrdi_vis: - case CODE_FOR_wrgsr_vis: - case CODE_FOR_bmasksi_vis: - case CODE_FOR_bmaskdi_vis: - case CODE_FOR_cmask8si_vis: - case CODE_FOR_cmask8di_vis: - case CODE_FOR_cmask16si_vis: - case CODE_FOR_cmask16di_vis: - case CODE_FOR_cmask32si_vis: - case CODE_FOR_cmask32di_vis: - break; - - default: - return build_zero_cst (rtype); - } + /* Note that a switch statement instead of the sequence of tests would + be incorrect as many of the CODE_FOR values could be CODE_FOR_nothing + and that would yield multiple alternatives with identical values. */ + if (icode == CODE_FOR_alignaddrsi_vis + || icode == CODE_FOR_alignaddrdi_vis + || icode == CODE_FOR_wrgsr_vis + || icode == CODE_FOR_bmasksi_vis + || icode == CODE_FOR_bmaskdi_vis + || icode == CODE_FOR_cmask8si_vis + || icode == CODE_FOR_cmask8di_vis + || icode == CODE_FOR_cmask16si_vis + || icode == CODE_FOR_cmask16di_vis + || icode == CODE_FOR_cmask32si_vis + || icode == CODE_FOR_cmask32di_vis) + ; + else + return build_zero_cst (rtype); } switch (icode)