[PATCH] CodeGenPrepare: Avoid and/or i1 in select conditions.
Matthias Braun
matze at braunis.de
Fri Apr 10 13:54:23 PDT 2015
I would be fine with either skipping the transformation if the types don't match up or extending the types. I personally would lean towards skipping the transformation as the extension is an extra instruction which makes the transformation less beneficial. As none of the targets I know are affected, what would the preference for your target?
- Matthias
> On Apr 10, 2015, at 1:40 PM, Michele Scandale <michele.scandale at gmail.com> wrote:
>
> Hi all,
>
> working on compiler-rt for an out-of-tree target I found an issue related to this commit. I was able to reproduce it using the Mips backend. Please have a look to the inline comments.
>
> Thanks in advance.
>
> -Michele
>
>
> REPOSITORY
> rL LLVM
>
> ================
> Comment at: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:4853-4854
> @@ +4852,4 @@
> + if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
> + SDValue And = DAG.getNode(ISD::AND, SDLoc(N), N0.getValueType(),
> + N0, N1_0);
> + return DAG.getNode(ISD::SELECT, SDLoc(N), N1.getValueType(), And,
> ----------------
> {F460280}
>
> Running "llc -O3" on the attached example I reach the following assertion
>
> ```
> llc: /home/scandale/devel/pure-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:3204: llvm::SDValue llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc, llvm::EVT, llvm::SDValue, llvm::SDValue, bool, bool, bool): Assertion `N1.getValueType() == N2.getValueType() && N1.getValueType() == VT && "Binary operator types must match!"' failed.
> #0 0x1997d75 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/scandale/devel/pure-llvm/llvm/lib/Support/Unix/Signals.inc:425:0
> #1 0x19980f1 PrintStackTraceSignalHandler(void*) /home/scandale/devel/pure-llvm/llvm/lib/Support/Unix/Signals.inc:483:0
> #2 0x1996cc9 SignalHandler(int) /home/scandale/devel/pure-llvm/llvm/lib/Support/Unix/Signals.inc:199:0
> #3 0x7f677b48e740 __restore_rt (/usr/lib/libpthread.so.0+0x10740)
> #4 0x7f677a6ce4b7 __GI_raise (/usr/lib/libc.so.6+0x334b7)
> #5 0x7f677a6cf88a __GI_abort (/usr/lib/libc.so.6+0x3488a)
> #6 0x7f677a6c741d __assert_fail_base (/usr/lib/libc.so.6+0x2c41d)
> #7 0x7f677a6c74d2 (/usr/lib/libc.so.6+0x2c4d2)
> #8 0x181f0cb llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc, llvm::EVT, llvm::SDValue, llvm::SDValue, bool, bool, bool) /home/scandale/devel/pure-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:3203:0
> #9 0x17781ae (anonymous namespace)::DAGCombiner::visitSELECT(llvm::SDNode*) /home/scandale/devel/pure-llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:4888:0
> ```
>
> This is because the condition values of the two select nodes have different types, thus we cannot create an AND between them.
>
> A quick workaround is to check also that the types of the two conditions are the same. An alternative could be to extend one of the condition to have homogeneous types.
>
>
> ================
> Comment at: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:4872-4873
> @@ +4871,4 @@
> + if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
> + SDValue Or = DAG.getNode(ISD::OR, SDLoc(N), N0.getValueType(),
> + N0, N2_0);
> + return DAG.getNode(ISD::SELECT, SDLoc(N), N1.getValueType(), Or,
> ----------------
> Same issue of lines 4853-4854...
>
> http://reviews.llvm.org/D7622
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
>
> _______________________________________________
> 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