[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