[PATCH] AArch64: Relax assert about large shift sizes.

Ahmed Bougacha ahmed.bougacha at gmail.com
Mon Jan 12 16:53:06 PST 2015


On Tue, Jan 13, 2015 at 1:34 AM, Matthias Braun <matze at braunis.de> wrote:
> I think replacing it with undef would be legal, but isn't replacing this
> with undef a combine/constant fold thing? Should we duplicate that logic in
> the Selection DAG? I'm new to this part of llvm, so maybe I don't understand
> the philosophy here yet.

The SelectionDAG has its own combiner (see
lib/CodeGen/SelectionDAG/DAGCombiner.cpp).

A quick examination of visitSRL there shows the undef folding is after
the both-constants folding, which I guess fails for some reason in
this case (probably the bitcast).

In any case, I think the change in your patch is OK; Quentin, what do you think?

-Ahmed

> Greetings
> Matthias
>
> On Jan 12, 2015, at 4:14 PM, Quentin Colombet <qcolombet at apple.com> wrote:
>
> Hi Matthias,
>
> I am wondering if we shouldn’t generate an undef node in Selection DAG for
> such shifts, unless the semantic is properly defined there.
>
> What do you think?
>
>
> On Jan 12, 2015, at 3:28 PM, Matthias Braun <matze at braunis.de> wrote:
>
> Shift sizes larger than the size of the value in bits can happen if
> constant folding fails.
>
> Testcase based on rdar://19211454
>
> http://reviews.llvm.org/D6940
>
> Files:
> lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
> test/CodeGen/AArch64/large_shift.ll
>
> Index: lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
> ===================================================================
> --- lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
> +++ lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
> @@ -1424,8 +1424,10 @@
>  } else
>    return false;
>
> -  assert((BiggerPattern || (Srl_imm > 0 && Srl_imm < VT.getSizeInBits()))
> &&
> -         "bad amount in shift node!");
> +  // Bail out on large immediates. This happens when no proper
> +  // combining/constant folding was performed.
> +  if (!BiggerPattern && (Srl_imm <= 0 || Srl_imm >= VT.getSizeInBits()))
> +    return false;
>
>  LSB = Srl_imm;
>  MSB = Srl_imm + (VT == MVT::i32 ? CountTrailingOnes_32(And_imm)
> Index: test/CodeGen/AArch64/large_shift.ll
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/AArch64/large_shift.ll
> @@ -0,0 +1,18 @@
> +; RUN: llc -march=aarch64 -o - %s
> +target triple = "arm64-unknown-unknown"
> +
> +declare void @t()
> +
> +define void @foo() {
> +  %c = bitcast i64 270458 to i64
> +  %t0 = lshr i64 %c, 422383
>
>
> What assembly is generated for this?
>
> Thanks,
> -Quentin
>
> +  %t1 = trunc i64 %t0 to i1
> +  br i1 %t1, label %BB1, label %BB0
> +
> +BB0:
> +  call void @t()
> +  br label %BB1
> +
> +BB1:
> +  ret void
> +}
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
> <D6940.18054.patch>_______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list