Skip to content
  • Duncan Sands's avatar
    Revert commits 96556 and 96640, because commit 96556 breaks the · d0bf6f64
    Duncan Sands authored
    dragonegg self-host build.  I reverted 96640 in order to revert
    96556 (96640 goes on top of 96556), but it also looks like with
    both of them applied the breakage happens even earlier.  The
    symptom of the 96556 miscompile is the following crash:
    
      llvm[3]: Compiling AlphaISelLowering.cpp for Release build
      cc1plus: /home/duncan/tmp/tmp/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:4982: void llvm::SelectionDAG::ReplaceAllUsesWith(llvm::SDNode*, llvm::SDNode*, llvm::SelectionDAG::DAGUpdateListener*): Assertion `(!From->hasAnyUseOfValue(i) || From->getValueType(i) == To->getValueType(i)) && "Cannot use this version of ReplaceAllUsesWith!"' failed.
      Stack dump:
      0.	Running pass 'X86 DAG->DAG Instruction Selection' on function '@_ZN4llvm19AlphaTargetLowering14LowerOperationENS_7SDValueERNS_12SelectionDAGE'
      g++: Internal error: Aborted (program cc1plus)
    
    This occurs when building LLVM using LLVM built by LLVM (via
    dragonegg).  Probably LLVM has miscompiled itself, though it
    may have miscompiled GCC and/or dragonegg itself: at this point
    of the self-host build, all of GCC, LLVM and dragonegg were built
    using LLVM.  Unfortunately this kind of thing is extremely hard
    to debug, and while I did rummage around a bit I didn't find any
    smoking guns, aka obviously miscompiled code.
    
    Found by bisection.
    
    r96556 | evancheng | 2010-02-18 03:13:50 +0100 (Thu, 18 Feb 2010) | 5 lines
    
    Some dag combiner goodness:
    Transform br (xor (x, y)) -> br (x != y)
    Transform br (xor (xor (x,y), 1)) -> br (x == y)
    Also normalize (and (X, 1) == / != 1 -> (and (X, 1)) != / == 0 to match to "test on x86" and "tst on arm"
    
    r96640 | evancheng | 2010-02-19 01:34:39 +0100 (Fri, 19 Feb 2010) | 16 lines
    
    Transform (xor (setcc), (setcc)) == / != 1 to
    (xor (setcc), (setcc)) != / == 1.
    
    e.g. On x86_64
      %0 = icmp eq i32 %x, 0
      %1 = icmp eq i32 %y, 0
      %2 = xor i1 %1, %0
      br i1 %2, label %bb, label %return
    =>
    	testl   %edi, %edi
    	sete    %al
    	testl   %esi, %esi
    	sete    %cl
    	cmpb    %al, %cl
    	je      LBB1_2
    
    llvm-svn: 96672
    d0bf6f64
Loading