Commit 265fa123 authored by Bill Wendling's avatar Bill Wendling
Browse files

For PR9500.

--- Merging r128041 into '.':
U    test/CodeGen/X86/fast-isel-gep.ll
U    lib/Target/X86/X86FastISel.cpp

llvm-svn: 128042
parent 59fe9d15
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -399,22 +399,27 @@ bool X86FastISel::X86SelectAddress(const Value *V, X86AddressMode &AM) {
        Disp += SL->getElementOffset(Idx);
      } else {
        uint64_t S = TD.getTypeAllocSize(GTI.getIndexedType());
        SmallVector<const Value *, 4> Worklist;
        Worklist.push_back(Op);
        do {
          Op = Worklist.pop_back_val();
        for (;;) {
          if (const ConstantInt *CI = dyn_cast<ConstantInt>(Op)) {
            // Constant-offset addressing.
            Disp += CI->getSExtValue() * S;
          } else if (isa<AddOperator>(Op) &&
            break;
          }
          if (isa<AddOperator>(Op) &&
              (!isa<Instruction>(Op) ||
               FuncInfo.MBBMap[cast<Instruction>(Op)->getParent()]
                 == FuncInfo.MBB) &&
              isa<ConstantInt>(cast<AddOperator>(Op)->getOperand(1))) {
            // An add with a constant operand. Fold the constant.
            // An add (in the same block) with a constant operand. Fold the
            // constant.
            ConstantInt *CI =
              cast<ConstantInt>(cast<AddOperator>(Op)->getOperand(1));
            Disp += CI->getSExtValue() * S;
            // Add the other operand back to the work list.
            Worklist.push_back(cast<AddOperator>(Op)->getOperand(0));
          } else if (IndexReg == 0 &&
            // Iterate on the other operand.
            Op = cast<AddOperator>(Op)->getOperand(0);
            continue;
          }
          if (IndexReg == 0 &&
              (!AM.GV || !Subtarget->isPICStyleRIPRel()) &&
              (S == 1 || S == 2 || S == 4 || S == 8)) {
            // Scaled-index addressing.
@@ -422,10 +427,11 @@ bool X86FastISel::X86SelectAddress(const Value *V, X86AddressMode &AM) {
            IndexReg = getRegForGEPIndex(Op).first;
            if (IndexReg == 0)
              return false;
          } else
            break;
          }
          // Unsupported.
          goto unsupported_gep;
        } while (!Worklist.empty());
        }
      }
    }
    // Check for displacement overflow.
+19 −0
Original line number Diff line number Diff line
@@ -87,4 +87,23 @@ define i64 @test5(i8* %A, i32 %I, i64 %B) nounwind {
; X64-NEXT: ret
}

; PR9500, rdar://9156159 - Don't do non-local address mode folding,
; because it may require values which wouldn't otherwise be live out
; of their blocks.
define void @test6() {
if.end:                                           ; preds = %if.then, %invoke.cont
  %tmp15 = load i64* undef
  %dec = add i64 %tmp15, 13
  store i64 %dec, i64* undef
  %call17 = invoke i8* @_ZNK18G__FastAllocString4dataEv()
          to label %invoke.cont16 unwind label %lpad

invoke.cont16:                                    ; preds = %if.then14
  %arrayidx18 = getelementptr inbounds i8* %call17, i64 %dec
  store i8 0, i8* %arrayidx18
  unreachable

lpad:                                             ; preds = %if.end19, %if.then14, %if.end, %entry
  unreachable
}
declare i8* @_ZNK18G__FastAllocString4dataEv() nounwind