In this PR we ICE when expanding the __rbit builtin with a NULL target rtx.
I *think* that only happens when the result is unused and hence maybe we shouldn't be expanding
any RTL at all, but the ICE here is easily fixed by deriving the mode from the type of the expression
rather than the target.
This patch does that.
Bootstrapped and tested on aarch64-none-linux-gnu.
gcc/ChangeLog:
PR target/108140
* config/aarch64/aarch64-builtins.cc
(aarch64_expand_builtin_data_intrinsic): Handle NULL target.
gcc/testsuite/ChangeLog:
PR target/108140
* gcc.target/aarch64/acle/pr108140.c: New test.
aarch64_expand_builtin_data_intrinsic (unsigned int fcode, tree exp, rtx target)
{
expand_operand ops[2];
- machine_mode mode = GET_MODE (target);
+ machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
create_output_operand (&ops[0], target, mode);
create_input_operand (&ops[1], expand_normal (CALL_EXPR_ARG (exp, 0)), mode);
enum insn_code icode;
--- /dev/null
+/* PR target/108140 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include<arm_acle.h>
+
+int
+main(int argc, char *argv[])
+{
+ unsigned long long input = argc-1;
+ unsigned long long v = __clz(__rbit(input));
+ __builtin_printf("%d %d\n", argc, v >= 64 ? 123 : 456);
+ return 0;
+}
+