Commit d1b59c20 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merge in fix for PR9561.

llvm-svn: 128354
parent 4b28ae01
Loading
Loading
Loading
Loading
+23 −14
Original line number Diff line number Diff line
@@ -340,24 +340,33 @@ static bool isCompleteOverwrite(const AliasAnalysis::Location &Later,
  // Okay, we have stores to two completely different pointers.  Try to
  // decompose the pointer into a "base + constant_offset" form.  If the base
  // pointers are equal, then we can reason about the two stores.
  int64_t Off1 = 0, Off2 = 0;
  const Value *BP1 = GetPointerBaseWithConstantOffset(P1, Off1, TD);
  const Value *BP2 = GetPointerBaseWithConstantOffset(P2, Off2, TD);
  int64_t EarlierOff = 0, LaterOff = 0;
  const Value *BP1 = GetPointerBaseWithConstantOffset(P1, EarlierOff, TD);
  const Value *BP2 = GetPointerBaseWithConstantOffset(P2, LaterOff, TD);
  
  // If the base pointers still differ, we have two completely different stores.
  if (BP1 != BP2)
    return false;

  // Otherwise, we might have a situation like:
  //  store i16 -> P + 1 Byte
  //  store i32 -> P
  // In this case, we see if the later store completely overlaps all bytes
  // stored by the previous store.
  if (Off1 < Off2 ||                       // Earlier starts before Later.
      Off1+Earlier.Size > Off2+Later.Size) // Earlier goes beyond Later.
    return false;
  // Otherwise, we have complete overlap.
  // The later store completely overlaps the earlier store if:
  // 
  // 1. Both start at the same offset and the later one's size is greater than
  //    or equal to the earlier one's, or
  //
  //      |--earlier--|
  //      |--   later   --|
  //      
  // 2. The earlier store has an offset greater than the later offset, but which
  //    still lies completely within the later store.
  //
  //        |--earlier--|
  //    |-----  later  ------|
  if (EarlierOff >= LaterOff &&
      EarlierOff + Earlier.Size <= LaterOff + Later.Size)
    return true;

  // Otherwise, they don't completely overlap.
  return false;
}

/// isPossibleSelfRead - If 'Inst' might be a self read (i.e. a noop copy of a