<div dir="ltr">This looks like a we're finding an equivalence in the DAG and but keeping a stale reference. I'll take a little bit of time today and see if I can work this out. But I don't think this was so important a change <div>to merit keeping it. Let's plan on reverting this if we don't have something today.</div><div><br></div><div>-Nirav </div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, May 3, 2018 at 10:03 AM Jesper Antonsson <<a href="mailto:jesper.antonsson@ericsson.com">jesper.antonsson@ericsson.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
We keep running into variations of this bug in our automated testing at Ericsson. Zhendong has registered 36602. Quentin has also<br>
registered a PR about this patch not doing what's intended in some case and giving him performance regressions. And Amaury doesn't<br>
seem to get back to us. Nirav, as you were one of the reviewers, do you have an idea about what to do about these issues? (I tried<br>
to look at it, but I'm too unfamiliar with the machinery.) Is it time to revert?<br>
<br>
BR, Â Jesper<br>
<br>
<br>
<br>
On mån, 2018-03-19 at 12:32 +0100, Mikael Holmén via llvm-commits wrote:<br>
> Hi Amaury,<br>
> <br>
> It seems like<br>
> <br>
> Â <a href="https://bugs.llvm.org/show_bug.cgi?id=36602" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=36602</a><br>
> <br>
> describes the same thing I found.<br>
> <br>
> Did you take a look at the problem?<br>
> <br>
> Regards,<br>
> Mikael<br>
> <br>
> On 03/14/2018 12:51 PM, Mikael Holmén wrote:<br>
> > <br>
> > Hi Amaury,<br>
> > <br>
> > llc crashes on the attached ll file crashes with your patch:<br>
> > <br>
> > llc -o - fail.ll -disable-cgp-branch-opts<br>
> > <br>
> > yields<br>
> > <br>
> > Â Â Â Â Â Â Â Â .text<br>
> >         .file  "fail.ll"<br>
> > Operand not processed?<br>
> > t13: ch = br t15, BasicBlock:ch<bb1 0x4250b98><br>
> > <br>
> > UNREACHABLE executed at ../lib/CodeGen/SelectionDAG/LegalizeTypes.cpp:476!<br>
> > #0 0x0000000001e8a874 PrintStackTraceSignalHandler(void*)Â <br>
> > (build-all/bin/llc+0x1e8a874)<br>
> > #1 0x0000000001e8afe6 SignalHandler(int) (build-all/bin/llc+0x1e8afe6)<br>
> > #2 0x00007f950fde2330 __restore_rt <br>
> > (/lib/x86_64-linux-gnu/libpthread.so.0+0x10330)<br>
> > #3 0x00007f950e9d1c37 gsignal <br>
> > /build/eglibc-ripdx6/eglibc-2.19/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:0Â <br>
> > <br>
> > #4 0x00007f950e9d5028 abort <br>
> > /build/eglibc-ripdx6/eglibc-2.19/stdlib/abort.c:91:0<br>
> > #5 0x0000000001e41b5d llvm::llvm_unreachable_internal(char const*, char <br>
> > const*, unsigned int) (build-all/bin/llc+0x1e41b5d)<br>
> > #6 0x0000000001d9cbaf llvm::DAGTypeLegalizer::run()Â <br>
> > (build-all/bin/llc+0x1d9cbaf)<br>
> > #7 0x0000000001da29d5 llvm::SelectionDAG::LegalizeTypes()Â <br>
> > (build-all/bin/llc+0x1da29d5)<br>
> > #8 0x0000000001d567c9 llvm::SelectionDAGISel::CodeGenAndEmitDAG()Â <br>
> > (build-all/bin/llc+0x1d567c9)<br>
> > #9 0x0000000001d549e1Â <br>
> > llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&)Â <br>
> > (build-all/bin/llc+0x1d549e1)<br>
> > #10 0x0000000001d50ca9Â <br>
> > llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&)Â <br>
> > (build-all/bin/llc+0x1d50ca9)<br>
> > #11 0x000000000112b2a1 (anonymous <br>
> > namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (build-all/bin/llc+0x112b2a1)Â <br>
> > <br>
> > #12 0x00000000015fec79Â <br>
> > llvm::MachineFunctionPass::runOnFunction(llvm::Function&)Â <br>
> > (build-all/bin/llc+0x15fec79)<br>
> > #13 0x0000000001904ce8Â <br>
> > llvm::FPPassManager::runOnFunction(llvm::Function&)Â <br>
> > (build-all/bin/llc+0x1904ce8)<br>
> > #14 0x0000000001904f28 llvm::FPPassManager::runOnModule(llvm::Module&)Â <br>
> > (build-all/bin/llc+0x1904f28)<br>
> > #15 0x0000000001905405 llvm::legacy::PassManagerImpl::run(llvm::Module&)Â <br>
> > (build-all/bin/llc+0x1905405)<br>
> > #16 0x00000000006db358 compileModule(char**, llvm::LLVMContext&)Â <br>
> > (build-all/bin/llc+0x6db358)<br>
> > #17 0x00000000006d8acb main (build-all/bin/llc+0x6d8acb)<br>
> > #18 0x00007f950e9bcf45 __libc_start_main <br>
> > /build/eglibc-ripdx6/eglibc-2.19/csu/libc-start.c:321:0<br>
> > #19 0x00000000006d62ca _start (build-all/bin/llc+0x6d62ca)<br>
> > Stack dump:<br>
> > 0.     Program arguments: build-all/bin/llc -o - fail.ll <br>
> > -disable-cgp-branch-opts<br>
> > 1.     Running pass 'Function Pass Manager' on module 'fail.ll'.<br>
> > 2.     Running pass 'X86 DAG->DAG Instruction Selection' on function <br>
> > '@fn2'<br>
> > Abort<br>
> > <br>
> > <br>
> > I just took a quick look in the debugger and saw that in <br>
> > DAGCombiner::rebuildSetCC() we end up at<br>
> > <br>
> > Â Â Â Â // Avoid missing important xor optimizations.<br>
> > Â Â Â Â while (SDValue Tmp = visitXOR(TheXor)) {<br>
> > Â Â Â Â Â Â // We don't have a XOR anymore, bail.<br>
> > Â Â Â Â Â Â if (Tmp.getOpcode() != ISD::XOR)<br>
> > Â Â Â Â Â Â Â Â return Tmp;<br>
> > <br>
> > And when we do the above<br>
> > <br>
> > Â Â return Tmp;<br>
> > <br>
> > Tmp is:<br>
> > <br>
> > (gdb) p Tmp->dump()<br>
> > t10: i1 = <<Deleted Node!>><br>
> > <br>
> > and this "Deleted Node" is then used to create a new brcond in <br>
> > DAGCombiner::visitBRCOND:<br>
> > <br>
> > Â Â Â Â if (SDValue NewN1 = rebuildSetCC(N1))<br>
> >       return DAG.getNode(ISD::BRCOND, SDLoc(N), MVT::Other, Chain, <br>
> > NewN1, N2);<br>
> > <br>
> > <br>
> > We noticed this when we ran tests on csmith-generated code so it's not a <br>
> > huge issue for us but it's still a regression I thought you'd be <br>
> > interested in.<br>
> > <br>
> > Regards,<br>
> > Mikael<br>
> > <br>
> > On 02/23/2018 12:50 PM, Amaury Sechet via llvm-commits wrote:<br>
> > > <br>
> > > Author: deadalnix<br>
> > > Date: Fri Feb 23 03:50:42 2018<br>
> > > New Revision: 325892<br>
> > > <br>
> > > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=325892&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=325892&view=rev</a><br>
> > > Log:<br>
> > > [DAGCOmbine] Ensure that (brcond (setcc ...)) is handled in a <br>
> > > canonical manner.<br>
> > > <br>
> > > Summary:<br>
> > > There are transformation that change setcc into other constructs, and <br>
> > > transform that try to reconstruct a setcc from the brcond condition. <br>
> > > Depending on what order these transform are done, the end result differs.<br>
> > > <br>
> > > Most of the time, it is preferable to get a setcc as a brcond argument <br>
> > > (and this is why brcond try to recreate the setcc in the first place)Â <br>
> > > so we ensure this is done every time by also doing it at the setcc <br>
> > > level when the only user is a brcond.<br>
> > > <br>
> > > Reviewers: spatel, hfinkel, niravd, craig.topper<br>
> > > <br>
> > > Subscribers: nhaehnle, llvm-commits<br>
> > > <br>
> > > Differential Revision: <a href="https://reviews.llvm.org/D41235" rel="noreferrer" target="_blank">https://reviews.llvm.org/D41235</a><br>
> > > <br>
> > > Modified:<br>
> > > Â Â Â Â llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
> > > Â Â Â Â llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td<br>
> > > Â Â Â Â llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll<br>
> > > Â Â Â Â llvm/trunk/test/CodeGen/AMDGPU/setcc.ll<br>
> > > Â Â Â Â llvm/trunk/test/CodeGen/X86/and-sink.ll<br>
> > > Â Â Â Â llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll<br>
> > > Â Â Â Â llvm/trunk/test/CodeGen/X86/or-branch.ll<br>
> > > <br>
> > > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=325892&r1=325891&r2=325892&view=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=325892&r1=325891&r2=325892&view=</a><br>
> > > diff <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
> > > +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Feb 23Â <br>
> > > 03:50:42 2018<br>
> > > @@ -415,7 +415,8 @@ namespace {<br>
> > > Â Â Â Â Â SDValue foldLogicOfSetCCs(bool IsAnd, SDValue N0, SDValue N1,<br>
> > > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â const SDLoc &DL);<br>
> > >      SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, <br>
> > > ISD::CondCode Cond,<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â const SDLoc &DL, bool foldBooleans = true);<br>
> > > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â const SDLoc &DL, bool foldBooleans);<br>
> > > +Â Â Â SDValue rebuildSetCC(SDValue N);<br>
> > > Â Â Â Â Â bool isSetCCEquivalent(SDValue N, SDValue &LHS, SDValue &RHS,<br>
> > > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â SDValue &CC) const;<br>
> > > @@ -7157,9 +7158,33 @@ SDValue DAGCombiner::visitSELECT_CC(SDNo<br>
> > > Â }<br>
> > > Â SDValue DAGCombiner::visitSETCC(SDNode *N) {<br>
> > > - return SimplifySetCC(N->getValueType(0), N->getOperand(0), <br>
> > > N->getOperand(1),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â cast<CondCodeSDNode>(N->getOperand(2))->get(),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â SDLoc(N));<br>
> > > +Â // setcc is very commonly used as an argument to brcond. This pattern<br>
> > > + // also lend itself to numerous combines and, as a result, it is <br>
> > > desired<br>
> > > +Â // we keep the argument to a brcond as a setcc as much as possible.<br>
> > > +Â bool PreferSetCC =<br>
> > > +Â Â Â Â Â N->hasOneUse() && N->use_begin()->getOpcode() == ISD::BRCOND;<br>
> > > +<br>
> > > +Â SDValue Combined = SimplifySetCC(<br>
> > > +Â Â Â Â Â N->getValueType(0), N->getOperand(0), N->getOperand(1),<br>
> > > +     cast<CondCodeSDNode>(N->getOperand(2))->get(), SDLoc(N), <br>
> > > !PreferSetCC);<br>
> > > +<br>
> > > +Â if (!Combined)<br>
> > > +Â Â Â return SDValue();<br>
> > > +<br>
> > > +Â // If we prefer to have a setcc, and we don't, we'll try our best to<br>
> > > +Â // recreate one using rebuildSetCC.<br>
> > > +Â if (PreferSetCC && Combined.getOpcode() != ISD::SETCC) {<br>
> > > +Â Â Â SDValue NewSetCC = rebuildSetCC(Combined);<br>
> > > +<br>
> > > +Â Â Â // We don't have anything interesting to combine to.<br>
> > > +Â Â Â if (NewSetCC.getNode() == N)<br>
> > > +Â Â Â Â Â return SDValue();<br>
> > > +<br>
> > > +Â Â Â if (NewSetCC)<br>
> > > +Â Â Â Â Â return NewSetCC;<br>
> > > +Â }<br>
> > > +<br>
> > > +Â return Combined;<br>
> > > Â }<br>
> > > Â SDValue DAGCombiner::visitSETCCE(SDNode *N) {<br>
> > > @@ -11151,16 +11176,22 @@ SDValue DAGCombiner::visitBRCOND(SDNode<br>
> > > Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â N1.getOperand(0), N1.getOperand(1), N2);<br>
> > > Â Â Â }<br>
> > > -Â if ((N1.hasOneUse() && N1.getOpcode() == ISD::SRL) ||<br>
> > > -Â Â Â Â Â ((N1.getOpcode() == ISD::TRUNCATE && N1.hasOneUse()) &&<br>
> > > -Â Â Â Â Â Â (N1.getOperand(0).hasOneUse() &&<br>
> > > -Â Â Â Â Â Â Â N1.getOperand(0).getOpcode() == ISD::SRL))) {<br>
> > > -Â Â Â SDNode *Trunc = nullptr;<br>
> > > -Â Â Â if (N1.getOpcode() == ISD::TRUNCATE) {<br>
> > > -Â Â Â Â Â // Look pass the truncate.<br>
> > > -Â Â Â Â Â Trunc = N1.getNode();<br>
> > > -Â Â Â Â Â N1 = N1.getOperand(0);<br>
> > > -Â Â Â }<br>
> > > +Â if (N1.hasOneUse()) {<br>
> > > +Â Â Â if (SDValue NewN1 = rebuildSetCC(N1))<br>
> > > +     return DAG.getNode(ISD::BRCOND, SDLoc(N), MVT::Other, Chain, <br>
> > > NewN1, N2);<br>
> > > +Â }<br>
> > > +<br>
> > > +Â return SDValue();<br>
> > > +}<br>
> > > +<br>
> > > +SDValue DAGCombiner::rebuildSetCC(SDValue N) {<br>
> > > +Â if (N.getOpcode() == ISD::SRL ||<br>
> > > +Â Â Â Â Â (N.getOpcode() == ISD::TRUNCATE &&<br>
> > > +Â Â Â Â Â Â (N.getOperand(0).hasOneUse() &&<br>
> > > +Â Â Â Â Â Â Â N.getOperand(0).getOpcode() == ISD::SRL))) {<br>
> > > +Â Â Â // Look pass the truncate.<br>
> > > +Â Â Â if (N.getOpcode() == ISD::TRUNCATE)<br>
> > > +Â Â Â Â Â N = N.getOperand(0);<br>
> > > Â Â Â Â Â // Match this pattern so that we can generate simpler code:<br>
> > > Â Â Â Â Â //<br>
> > > @@ -11179,75 +11210,43 @@ SDValue DAGCombiner::visitBRCOND(SDNode<br>
> > >      // This applies only when the AND constant value has one bit set <br>
> > > and the<br>
> > >      // SRL constant is equal to the log2 of the AND constant. The <br>
> > > back-end is<br>
> > > Â Â Â Â Â // smart enough to convert the result into a TEST/JMP sequence.<br>
> > > -Â Â Â SDValue Op0 = N1.getOperand(0);<br>
> > > -Â Â Â SDValue Op1 = N1.getOperand(1);<br>
> > > +Â Â Â SDValue Op0 = N.getOperand(0);<br>
> > > +Â Â Â SDValue Op1 = N.getOperand(1);<br>
> > > -Â Â Â if (Op0.getOpcode() == ISD::AND &&<br>
> > > -Â Â Â Â Â Â Â Op1.getOpcode() == ISD::Constant) {<br>
> > > +Â Â Â if (Op0.getOpcode() == ISD::AND && Op1.getOpcode() ==Â <br>
> > > ISD::Constant) {<br>
> > > Â Â Â Â Â Â Â SDValue AndOp1 = Op0.getOperand(1);<br>
> > > Â Â Â Â Â Â Â if (AndOp1.getOpcode() == ISD::Constant) {<br>
> > > Â Â Â Â Â Â Â Â Â const APInt &AndConst =Â <br>
> > > cast<ConstantSDNode>(AndOp1)->getAPIntValue();<br>
> > > Â Â Â Â Â Â Â Â Â if (AndConst.isPowerOf2() &&<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â <br>
> > > cast<ConstantSDNode>(Op1)->getAPIntValue()==AndConst.logBase2()) {<br>
> > > +Â Â Â Â Â Â Â Â Â Â Â cast<ConstantSDNode>(Op1)->getAPIntValue() ==Â <br>
> > > AndConst.logBase2()) {<br>
> > > Â Â Â Â Â Â Â Â Â Â Â SDLoc DL(N);<br>
> > > -Â Â Â Â Â Â Â Â Â SDValue SetCC =<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â DAG.getSetCC(DL,<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â getSetCCResultType(Op0.getValueType()),<br>
> > > -                        Op0, DAG.getConstant(0, DL, <br>
> > > Op0.getValueType()),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ISD::SETNE);<br>
> > > -<br>
> > > -Â Â Â Â Â Â Â Â Â SDValue NewBRCond = DAG.getNode(ISD::BRCOND, DL,<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â MVT::Other, Chain, SetCC, N2);<br>
> > > -         // Don't add the new BRCond into the worklist or else <br>
> > > SimplifySelectCC<br>
> > > -Â Â Â Â Â Â Â Â Â // will convert it back to (X & C1) >> C2.<br>
> > > -Â Â Â Â Â Â Â Â Â CombineTo(N, NewBRCond, false);<br>
> > > -Â Â Â Â Â Â Â Â Â // Truncate is dead.<br>
> > > -Â Â Â Â Â Â Â Â Â if (Trunc)<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â deleteAndRecombine(Trunc);<br>
> > > -Â Â Â Â Â Â Â Â Â // Replace the uses of SRL with SETCC<br>
> > > -Â Â Â Â Â Â Â Â Â WorklistRemover DeadNodes(*this);<br>
> > > -Â Â Â Â Â Â Â Â Â DAG.ReplaceAllUsesOfValueWith(N1, SetCC);<br>
> > > -Â Â Â Â Â Â Â Â Â deleteAndRecombine(N1.getNode());<br>
> > > -         return SDValue(N, 0);  // Return N so it doesn't get <br>
> > > rechecked!<br>
> > > +         return DAG.getSetCC(DL, <br>
> > > getSetCCResultType(Op0.getValueType()),<br>
> > > +                             Op0, DAG.getConstant(0, DL, <br>
> > > Op0.getValueType()),<br>
> > > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ISD::SETNE);<br>
> > > Â Â Â Â Â Â Â Â Â }<br>
> > > Â Â Â Â Â Â Â }<br>
> > > Â Â Â Â Â }<br>
> > > -<br>
> > > -Â Â Â if (Trunc)<br>
> > > -Â Â Â Â Â // Restore N1 if the above transformation doesn't match.<br>
> > > -Â Â Â Â Â N1 = N->getOperand(1);<br>
> > > Â Â Â }<br>
> > > Â Â Â // Transform br(xor(x, y)) -> br(x != y)<br>
> > > Â Â Â // Transform br(xor(xor(x,y), 1)) -> br (x == y)<br>
> > > -Â if (N1.hasOneUse() && N1.getOpcode() == ISD::XOR) {<br>
> > > -Â Â Â SDNode *TheXor = N1.getNode();<br>
> > > -Â Â Â SDValue Op0 = TheXor->getOperand(0);<br>
> > > -Â Â Â SDValue Op1 = TheXor->getOperand(1);<br>
> > > -Â Â Â if (Op0.getOpcode() == Op1.getOpcode()) {<br>
> > > -Â Â Â Â Â // Avoid missing important xor optimizations.<br>
> > > -Â Â Â Â Â if (SDValue Tmp = visitXOR(TheXor)) {<br>
> > > -Â Â Â Â Â Â Â if (Tmp.getNode() != TheXor) {<br>
> > > -Â Â Â Â Â Â Â Â Â DEBUG(dbgs() << "\nReplacing.8 ";<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â TheXor->dump(&DAG);<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â dbgs() << "\nWith: ";<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Tmp.getNode()->dump(&DAG);<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â dbgs() << '\n');<br>
> > > -Â Â Â Â Â Â Â Â Â WorklistRemover DeadNodes(*this);<br>
> > > -Â Â Â Â Â Â Â Â Â DAG.ReplaceAllUsesOfValueWith(N1, Tmp);<br>
> > > -Â Â Â Â Â Â Â Â Â deleteAndRecombine(TheXor);<br>
> > > -Â Â Â Â Â Â Â Â Â return DAG.getNode(ISD::BRCOND, SDLoc(N),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â MVT::Other, Chain, Tmp, N2);<br>
> > > -Â Â Â Â Â Â Â }<br>
> > > +Â if (N.getOpcode() == ISD::XOR) {<br>
> > > +Â Â Â SDNode *TheXor = N.getNode();<br>
> > > -Â Â Â Â Â Â Â // visitXOR has changed XOR's operands or replaced the XORÂ <br>
> > > completely,<br>
> > > -Â Â Â Â Â Â Â // bail out.<br>
> > > -Â Â Â Â Â Â Â return SDValue(N, 0);<br>
> > > -Â Â Â Â Â }<br>
> > > +Â Â Â // Avoid missing important xor optimizations.<br>
> > > +Â Â Â while (SDValue Tmp = visitXOR(TheXor)) {<br>
> > > +Â Â Â Â Â // We don't have a XOR anymore, bail.<br>
> > > +Â Â Â Â Â if (Tmp.getOpcode() != ISD::XOR)<br>
> > > +Â Â Â Â Â Â Â return Tmp;<br>
> > > +<br>
> > > +Â Â Â Â Â TheXor = Tmp.getNode();<br>
> > > Â Â Â Â Â }<br>
> > > +Â Â Â SDValue Op0 = TheXor->getOperand(0);<br>
> > > +Â Â Â SDValue Op1 = TheXor->getOperand(1);<br>
> > > +<br>
> > > Â Â Â Â Â if (Op0.getOpcode() != ISD::SETCC && Op1.getOpcode() !=Â <br>
> > > ISD::SETCC) {<br>
> > > Â Â Â Â Â Â Â bool Equal = false;<br>
> > > Â Â Â Â Â Â Â if (isOneConstant(Op0) && Op0.hasOneUse() &&<br>
> > > @@ -11256,19 +11255,12 @@ SDValue DAGCombiner::visitBRCOND(SDNode<br>
> > > Â Â Â Â Â Â Â Â Â Equal = true;<br>
> > > Â Â Â Â Â Â Â }<br>
> > > -Â Â Â Â Â EVT SetCCVT = N1.getValueType();<br>
> > > +Â Â Â Â Â EVT SetCCVT = N.getValueType();<br>
> > > Â Â Â Â Â Â Â if (LegalTypes)<br>
> > > Â Â Â Â Â Â Â Â Â SetCCVT = getSetCCResultType(SetCCVT);<br>
> > > -Â Â Â Â Â SDValue SetCC = DAG.getSetCC(SDLoc(TheXor),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â SetCCVT,<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Op0, Op1,<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Equal ? ISD::SETEQ : ISD::SETNE);<br>
> > > Â Â Â Â Â Â Â // Replace the uses of XOR with SETCC<br>
> > > -Â Â Â Â Â WorklistRemover DeadNodes(*this);<br>
> > > -Â Â Â Â Â DAG.ReplaceAllUsesOfValueWith(N1, SetCC);<br>
> > > -Â Â Â Â Â deleteAndRecombine(N1.getNode());<br>
> > > -Â Â Â Â Â return DAG.getNode(ISD::BRCOND, SDLoc(N),<br>
> > > -Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â MVT::Other, Chain, SetCC, N2);<br>
> > > +Â Â Â Â Â return DAG.getSetCC(SDLoc(TheXor), SetCCVT, Op0, Op1,<br>
> > > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Equal ? ISD::SETEQ : ISD::SETNE);<br>
> > > Â Â Â Â Â }<br>
> > > Â Â Â }<br>
> > > <br>
> > > Modified: llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td?rev=325892&r1=325891&r2=325892&view=dif" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td?rev=325892&r1=325891&r2=325892&view=dif</a><br>
> > > f <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td (original)<br>
> > > +++ llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td Fri Feb 23Â <br>
> > > 03:50:42 2018<br>
> > > @@ -2800,6 +2800,8 @@ def: Pat<(brcond (not I1:$Pu), bb:$dst),<br>
> > > Â Â Â Â Â Â Â Â Â Â (J2_jumpf I1:$Pu, bb:$dst)>;<br>
> > > Â def: Pat<(brcond (i1 (setne I1:$Pu, -1)), bb:$dst),<br>
> > > Â Â Â Â Â Â Â Â Â Â (J2_jumpf I1:$Pu, bb:$dst)>;<br>
> > > +def: Pat<(brcond (i1 (seteq I1:$Pu, 0)), bb:$dst),<br>
> > > +Â Â Â Â Â Â Â Â (J2_jumpf I1:$Pu, bb:$dst)>;<br>
> > > Â def: Pat<(brcond (i1 (setne I1:$Pu, 0)), bb:$dst),<br>
> > > Â Â Â Â Â Â Â Â Â Â (J2_jumpt I1:$Pu, bb:$dst)>;<br>
> > > <br>
> > > Modified: llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll?rev=325892&r1=325891&r2=325892&view" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll?rev=325892&r1=325891&r2=325892&view</a><br>
> > > =diff <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll (original)<br>
> > > +++ llvm/trunk/test/CodeGen/AMDGPU/cndmask-no-def-vcc.ll Fri Feb 23Â <br>
> > > 03:50:42 2018<br>
> > > @@ -7,7 +7,6 @@ declare i1 @llvm.amdgcn.class.f32(float,<br>
> > > Â ; GCN-LABEL: {{^}}vcc_shrink_vcc_def:<br>
> > > Â ; GCN: v_cmp_eq_u32_e64 vcc, s{{[0-9]+}}, 0{{$}}<br>
> > > Â ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, 1.0, v{{[0-9]+}}, vcc<br>
> > > -; GCN: v_cndmask_b32_e64 v0, 0, 1, s{{\[[0-9]+:[0-9]+\]}}<br>
> > >  define amdgpu_kernel void @vcc_shrink_vcc_def(float %arg, i32 %arg1, <br>
> > > float %arg2, i32 %arg3) {<br>
> > > Â bb0:<br>
> > > Â Â Â %tmp = icmp sgt i32 %arg1, 4<br>
> > > @@ -34,7 +33,6 @@ bb2:<br>
> > > Â ; GCN-LABEL: {{^}}preserve_condition_undef_flag:<br>
> > > Â ; GCN-NOT: vcc<br>
> > > Â ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, 1.0, v{{[0-9]+}}, vcc<br>
> > > -; GCN: v_cndmask_b32_e64 v0, 0, 1, s{{\[[0-9]+:[0-9]+\]}}<br>
> > >  define amdgpu_kernel void @preserve_condition_undef_flag(float %arg, <br>
> > > i32 %arg1, float %arg2) {<br>
> > > Â bb0:<br>
> > > Â Â Â %tmp = icmp sgt i32 %arg1, 4<br>
> > > <br>
> > > Modified: llvm/trunk/test/CodeGen/AMDGPU/setcc.ll<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/setcc.ll?rev=325892&r1=325891&r2=325892&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/setcc.ll?rev=325892&r1=325891&r2=325892&view=diff</a>Â <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/test/CodeGen/AMDGPU/setcc.ll (original)<br>
> > > +++ llvm/trunk/test/CodeGen/AMDGPU/setcc.ll Fri Feb 23 03:50:42 2018<br>
> > > @@ -397,9 +397,9 @@ endif:<br>
> > > Â }<br>
> > > Â ; FUNC-LABEL: setcc-i1-and-xor<br>
> > > -; GCN-DAG: v_cmp_ge_f32_e64 [[A:s\[[0-9]+:[0-9]+\]]], s{{[0-9]+}}, <br>
> > > 0{{$}}<br>
> > > -; GCN-DAG: v_cmp_le_f32_e64 [[B:s\[[0-9]+:[0-9]+\]]], s{{[0-9]+}}, 1.0<br>
> > > -; GCN: s_and_b64 s[2:3], [[A]], [[B]]<br>
> > > +; GCN-DAG: v_cmp_nge_f32_e64 [[A:s\[[0-9]+:[0-9]+\]]], s{{[0-9]+}}, <br>
> > > 0{{$}}<br>
> > > +; GCN-DAG: v_cmp_nle_f32_e64 [[B:s\[[0-9]+:[0-9]+\]]], s{{[0-9]+}}, 1.0<br>
> > > +; GCN: s_or_b64 s[2:3], [[A]], [[B]]<br>
> > >  define amdgpu_kernel void @setcc-i1-and-xor(i32 addrspace(1)* %out, <br>
> > > float %cond) #0 {<br>
> > > Â bb0:<br>
> > > Â Â Â %tmp5 = fcmp oge float %cond, 0.000000e+00<br>
> > > <br>
> > > Modified: llvm/trunk/test/CodeGen/X86/and-sink.ll<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/and-sink.ll?rev=325892&r1=325891&r2=325892&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/and-sink.ll?rev=325892&r1=325891&r2=325892&view=diff</a>Â <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/test/CodeGen/X86/and-sink.ll (original)<br>
> > > +++ llvm/trunk/test/CodeGen/X86/and-sink.ll Fri Feb 23 03:50:42 2018<br>
> > > @@ -14,8 +14,8 @@ define i32 @and_sink1(i32 %a, i1 %c) {<br>
> > > Â ; CHECK-NEXT:Â Â Â je .LBB0_3<br>
> > > Â ; CHECK-NEXT:Â # %bb.1: # %bb0<br>
> > > Â ; CHECK-NEXT:Â Â Â movl {{[0-9]+}}(%esp), %eax<br>
> > > -; CHECK-NEXT:Â Â Â movl $0, A<br>
> > > Â ; CHECK-NEXT:Â Â Â testb $4, %al<br>
> > > +; CHECK-NEXT:Â Â Â movl $0, A<br>
> > > Â ; CHECK-NEXT:Â Â Â jne .LBB0_3<br>
> > > Â ; CHECK-NEXT:Â # %bb.2: # %bb1<br>
> > > Â ; CHECK-NEXT:Â Â Â movl $1, %eax<br>
> > > @@ -61,8 +61,8 @@ define i32 @and_sink2(i32 %a, i1 %c, i1<br>
> > > Â ; CHECK-NEXT:Â Â Â je .LBB1_5<br>
> > > Â ; CHECK-NEXT:Â # %bb.3: # %bb1<br>
> > > Â ; CHECK-NEXT:Â Â Â # in Loop: Header=BB1_2 Depth=1<br>
> > > -; CHECK-NEXT:Â Â Â movl $0, C<br>
> > > Â ; CHECK-NEXT:Â Â Â testb $4, %cl<br>
> > > +; CHECK-NEXT:Â Â Â movl $0, C<br>
> > > Â ; CHECK-NEXT:Â Â Â jne .LBB1_2<br>
> > > Â ; CHECK-NEXT:Â # %bb.4: # %bb2<br>
> > > Â ; CHECK-NEXT:Â Â Â movl $1, %eax<br>
> > > <br>
> > > Modified: llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll?rev=325892&r1=325891&r2=325892&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll?rev=325892&r1=325891&r2=325892&view=diff</a>Â <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll (original)<br>
> > > +++ llvm/trunk/test/CodeGen/X86/fold-rmw-ops.ll Fri Feb 23 03:50:42 2018<br>
> > > @@ -1146,12 +1146,9 @@ b:<br>
> > > Â define void @and32_imm_br() nounwind {<br>
> > > Â ; CHECK-LABEL: and32_imm_br:<br>
> > > Â ; CHECK:Â Â Â Â Â Â # %bb.0: # %entry<br>
> > > -; CHECK-NEXT:Â Â Â movl $-2147483648, %eax # encoding:Â <br>
> > > [0xb8,0x00,0x00,0x00,0x80]<br>
> > > +; CHECK-NEXT:Â Â Â andl $-2147483648, {{.*}}(%rip) # encoding:Â <br>
> > > [0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80]<br>
> > > +; CHECK-NEXT:Â Â Â # fixup A - offset: 2, value: g32-8, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > Â ; CHECK-NEXT:Â Â Â # imm = 0x80000000<br>
> > > -; CHECK-NEXT:Â Â Â andl {{.*}}(%rip), %eax # encoding: [0x23,0x05,A,A,A,A]<br>
> > > -; CHECK-NEXT:Â Â Â # fixup A - offset: 2, value: g32-4, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > -; CHECK-NEXT:Â Â Â movl %eax, {{.*}}(%rip) # encoding: [0x89,0x05,A,A,A,A]<br>
> > > -; CHECK-NEXT:Â Â Â # fixup A - offset: 2, value: g32-4, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > Â ; CHECK-NEXT:Â Â Â jne .LBB35_2 # encoding: [0x75,A]<br>
> > > Â ; CHECK-NEXT:Â Â Â # fixup A - offset: 1, value: .LBB35_2-1, kind:Â <br>
> > > FK_PCRel_1<br>
> > > Â ; CHECK-NEXT:Â # %bb.1: # %a<br>
> > > @@ -1244,13 +1241,9 @@ b:<br>
> > > Â define void @and16_imm_br() nounwind {<br>
> > > Â ; CHECK-LABEL: and16_imm_br:<br>
> > > Â ; CHECK:Â Â Â Â Â Â # %bb.0: # %entry<br>
> > > -; CHECK-NEXT:Â Â Â movzwl {{.*}}(%rip), %eax # encoding:Â <br>
> > > [0x0f,0xb7,0x05,A,A,A,A]<br>
> > > -; CHECK-NEXT:Â Â Â # fixup A - offset: 3, value: g16-4, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > -; CHECK-NEXT:Â Â Â andl $32768, %eax # encoding:Â <br>
> > > [0x25,0x00,0x80,0x00,0x00]<br>
> > > +; CHECK-NEXT:Â Â Â andw $-32768, {{.*}}(%rip) # encoding:Â <br>
> > > [0x66,0x81,0x25,A,A,A,A,0x00,0x80]<br>
> > > +; CHECK-NEXT:Â Â Â # fixup A - offset: 3, value: g16-6, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > Â ; CHECK-NEXT:Â Â Â # imm = 0x8000<br>
> > > -; CHECK-NEXT:Â Â Â movw %ax, {{.*}}(%rip) # encoding:Â <br>
> > > [0x66,0x89,0x05,A,A,A,A]<br>
> > > -; CHECK-NEXT:Â Â Â # fixup A - offset: 3, value: g16-4, kind:Â <br>
> > > reloc_riprel_4byte<br>
> > > -; CHECK-NEXT:Â Â Â testw %ax, %ax # encoding: [0x66,0x85,0xc0]<br>
> > > Â ; CHECK-NEXT:Â Â Â jne .LBB38_2 # encoding: [0x75,A]<br>
> > > Â ; CHECK-NEXT:Â Â Â # fixup A - offset: 1, value: .LBB38_2-1, kind:Â <br>
> > > FK_PCRel_1<br>
> > > Â ; CHECK-NEXT:Â # %bb.1: # %a<br>
> > > <br>
> > > Modified: llvm/trunk/test/CodeGen/X86/or-branch.ll<br>
> > > URL:Â <br>
> > > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/or-branch.ll?rev=325892&r1=325891&r2=325892&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/or-branch.ll?rev=325892&r1=325891&r2=325892&view=diff</a>Â <br>
> > > <br>
> > > ==============================================================================Â <br>
> > > <br>
> > > --- llvm/trunk/test/CodeGen/X86/or-branch.ll (original)<br>
> > > +++ llvm/trunk/test/CodeGen/X86/or-branch.ll Fri Feb 23 03:50:42 2018<br>
> > > @@ -19,11 +19,10 @@ define void @foo(i32 %X, i32 %Y, i32 %Z)<br>
> > > Â ; JUMP1-LABEL: foo:<br>
> > > Â ; JUMP1:Â Â Â Â Â Â # %bb.0: # %entry<br>
> > > Â ; JUMP1-NEXT:Â Â Â cmpl $0, {{[0-9]+}}(%esp)<br>
> > > -; JUMP1-NEXT:Â Â Â sete %al<br>
> > > -; JUMP1-NEXT:Â Â Â cmpl $5, {{[0-9]+}}(%esp)<br>
> > > -; JUMP1-NEXT:Â Â Â setl %cl<br>
> > > -; JUMP1-NEXT:Â Â Â orb %al, %cl<br>
> > > -; JUMP1-NEXT:Â Â Â cmpb $1, %cl<br>
> > > +; JUMP1-NEXT:Â Â Â setne %al<br>
> > > +; JUMP1-NEXT:Â Â Â cmpl $4, {{[0-9]+}}(%esp)<br>
> > > +; JUMP1-NEXT:Â Â Â setg %cl<br>
> > > +; JUMP1-NEXT:Â Â Â testb %al, %cl<br>
> > > Â ; JUMP1-NEXT:Â Â Â jne .LBB0_1<br>
> > > Â ; JUMP1-NEXT:Â # %bb.2: # %cond_true<br>
> > > Â ; JUMP1-NEXT:Â Â Â jmp bar # TAILCALL<br>
> > > @@ -50,11 +49,10 @@ define void @unpredictable(i32 %X, i32 %<br>
> > > Â ; JUMP2-LABEL: unpredictable:<br>
> > > Â ; JUMP2:Â Â Â Â Â Â # %bb.0: # %entry<br>
> > > Â ; JUMP2-NEXT:Â Â Â cmpl $0, {{[0-9]+}}(%esp)<br>
> > > -; JUMP2-NEXT:Â Â Â sete %al<br>
> > > -; JUMP2-NEXT:Â Â Â cmpl $5, {{[0-9]+}}(%esp)<br>
> > > -; JUMP2-NEXT:Â Â Â setl %cl<br>
> > > -; JUMP2-NEXT:Â Â Â orb %al, %cl<br>
> > > -; JUMP2-NEXT:Â Â Â cmpb $1, %cl<br>
> > > +; JUMP2-NEXT:Â Â Â setne %al<br>
> > > +; JUMP2-NEXT:Â Â Â cmpl $4, {{[0-9]+}}(%esp)<br>
> > > +; JUMP2-NEXT:Â Â Â setg %cl<br>
> > > +; JUMP2-NEXT:Â Â Â testb %al, %cl<br>
> > > Â ; JUMP2-NEXT:Â Â Â jne .LBB1_1<br>
> > > Â ; JUMP2-NEXT:Â # %bb.2: # %cond_true<br>
> > > Â ; JUMP2-NEXT:Â Â Â jmp bar # TAILCALL<br>
> > > @@ -64,11 +62,10 @@ define void @unpredictable(i32 %X, i32 %<br>
> > > Â ; JUMP1-LABEL: unpredictable:<br>
> > > Â ; JUMP1:Â Â Â Â Â Â # %bb.0: # %entry<br>
> > > Â ; JUMP1-NEXT:Â Â Â cmpl $0, {{[0-9]+}}(%esp)<br>
> > > -; JUMP1-NEXT:Â Â Â sete %al<br>
> > > -; JUMP1-NEXT:Â Â Â cmpl $5, {{[0-9]+}}(%esp)<br>
> > > -; JUMP1-NEXT:Â Â Â setl %cl<br>
> > > -; JUMP1-NEXT:Â Â Â orb %al, %cl<br>
> > > -; JUMP1-NEXT:Â Â Â cmpb $1, %cl<br>
> > > +; JUMP1-NEXT:Â Â Â setne %al<br>
> > > +; JUMP1-NEXT:Â Â Â cmpl $4, {{[0-9]+}}(%esp)<br>
> > > +; JUMP1-NEXT:Â Â Â setg %cl<br>
> > > +; JUMP1-NEXT:Â Â Â testb %al, %cl<br>
> > > Â ; JUMP1-NEXT:Â Â Â jne .LBB1_1<br>
> > > Â ; JUMP1-NEXT:Â # %bb.2: # %cond_true<br>
> > > Â ; JUMP1-NEXT:Â Â Â jmp bar # TAILCALL<br>
> > > <br>
> > > <br>
> > > _______________________________________________<br>
> > > llvm-commits mailing list<br>
> > > <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> > > <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
> > > <br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a></blockquote></div>