Date: Mon, 27 May 2013 10:31:14 +0100 From: Andrew Turner <andrew@fubar.geek.nz> To: Tim Kientzle <kientzle@freebsd.org> Cc: freebsd-arm <freebsd-arm@freebsd.org> Subject: Re: Git crash on EABI system. Message-ID: <20130527103114.3fbb00fb@bender.Home> In-Reply-To: <2290084B-D302-4489-BB01-817497901E2B@freebsd.org> References: <A44A52E5-E878-45CD-B032-F111E5E244BA@freebsd.org> <51949698.80205@thieprojects.ch> <2290084B-D302-4489-BB01-817497901E2B@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--MP_/CBSQ4FQ.nDxaB1VcRwI/jng Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline On Thu, 16 May 2013 05:04:29 -0400 Tim Kientzle <kientzle@freebsd.org> wrote: > > On May 16, 2013, at 4:19 AM, Werner Thie wrote: > > >> Has anyone else seen this from git on a clang/EABI system? > >> > >> Assertion failed: (attr_stack->origin), function > >> prepare_attr_stack, file attr.c, line 630. > >> > >> Program received signal SIGABRT, Aborted. > >> [Switching to Thread 20c03300 (LWP 100076/git)] > >> 0x204b842c in thr_kill () from /lib/libc.so.7 > >> (gdb) bt > >> #0 0x204b842c in thr_kill () from /lib/libc.so.7 > >> #1 0x2044157c in raise () from /lib/libthr.so.3 > >> #2 0x20598130 in abort () from /lib/libc.so.7 > >> #3 0x20574630 in __assert () from /lib/libc.so.7 > >> #4 0x00076b28 in ?? () > >> > >> I'm planning to do a debug build and see if I can track down any > >> more details. > > > > Hi Tim > > > > just built git out of curiosity after your post on the BBone > > > > FreeBSD beaglebone 10.0-CURRENT FreeBSD 10.0-CURRENT #0 r250144M: > > Sat May 4 14:18:20 CEST 2013 > > root@xtools:/usr/home/wthie/proj/crochet-freebsd/work/obj/arm.armv6/usr/local/src/sys/BEAGLEBONE-NOWITNESS > > arm > > > > git crashes exactly as advertised when cloning a project in > > > > Assertion failed: (attr_stack->origin), function > > prepare_attr_stack, file attr.c, line 630. > > Thanks for verifying that. > > Unfortunately, a debug build (make -DWITH_DEBUG) does > not crash for me. So I clearly have more work ahead of me > to narrow this down. Hello Tim, Can you test the attached patch for llvm. It should fix git to not crash. The patch is llvm r180609 [1]. The issue was llvm failed to correctly account for pre-indexed loads/stores. It would then use a subtraction to get the correct address of the last slash however it used the wrong subtract instruction. Andrew [1] http://llvm.org/viewvc/llvm-project?view=revision&revision=180609 --MP_/CBSQ4FQ.nDxaB1VcRwI/jng Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=llvm_180609.diff Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp (revision 180608) +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp (revision 180609) @@ -7152,25 +7152,40 @@ assert(OtherUses[i]->getOperand(!OffsetIdx).getNode() == BasePtr.getNode() && "Expected BasePtr operand"); - APInt OV = - cast<ConstantSDNode>(Offset)->getAPIntValue(); - if (AM == ISD::PRE_DEC) - OV = -OV; + // We need to replace ptr0 in the following expression: + // x0 * offset0 + y0 * ptr0 = t0 + // knowing that + // x1 * offset1 + y1 * ptr0 = t1 (the indexed load/store) + // + // where x0, x1, y0 and y1 in {-1, 1} are given by the types of the + // indexed load/store and the expresion that needs to be re-written. + // + // Therefore, we have: + // t0 = (x0 * offset0 - x1 * y0 * y1 *offset1) + (y0 * y1) * t1 ConstantSDNode *CN = cast<ConstantSDNode>(OtherUses[i]->getOperand(OffsetIdx)); - APInt CNV = CN->getAPIntValue(); - if (OtherUses[i]->getOpcode() == ISD::SUB && OffsetIdx == 1) - CNV += OV; - else - CNV -= OV; + int X0, X1, Y0, Y1; + APInt Offset0 = CN->getAPIntValue(); + APInt Offset1 = cast<ConstantSDNode>(Offset)->getAPIntValue(); - SDValue NewOp1 = Result.getValue(isLoad ? 1 : 0); - SDValue NewOp2 = DAG.getConstant(CNV, CN->getValueType(0)); - if (OffsetIdx == 0) - std::swap(NewOp1, NewOp2); + X0 = (OtherUses[i]->getOpcode() == ISD::SUB && OffsetIdx == 1) ? -1 : 1; + Y0 = (OtherUses[i]->getOpcode() == ISD::SUB && OffsetIdx == 0) ? -1 : 1; + X1 = (AM == ISD::PRE_DEC && !Swapped) ? -1 : 1; + Y1 = (AM == ISD::PRE_DEC && Swapped) ? -1 : 1; - SDValue NewUse = DAG.getNode(OtherUses[i]->getOpcode(), + unsigned Opcode = (Y0 * Y1 < 0) ? ISD::SUB : ISD::ADD; + + APInt CNV = Offset0; + if (X0 < 0) CNV = -CNV; + if (X1 * Y0 * Y1 < 0) CNV = CNV + Offset1; + else CNV = CNV - Offset1; + + // We can now generate the new expression. + SDValue NewOp1 = DAG.getConstant(CNV, CN->getValueType(0)); + SDValue NewOp2 = Result.getValue(isLoad ? 1 : 0); + + SDValue NewUse = DAG.getNode(Opcode, OtherUses[i]->getDebugLoc(), OtherUses[i]->getValueType(0), NewOp1, NewOp2); DAG.ReplaceAllUsesOfValueWith(SDValue(OtherUses[i], 0), NewUse); --MP_/CBSQ4FQ.nDxaB1VcRwI/jng--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130527103114.3fbb00fb>