[llvm-commits] [llvm] r163678 - in /llvm/trunk: lib/CodeGen/StackColoring.cpp test/CodeGen/X86/StackColoring.ll

Duncan Sands baldrick at free.fr
Tue Sep 11 23:30:57 PDT 2012


Hi Nadav,

> The input program may contain intructions which are not inside lifetime
> markers. This can happen due to a bug in the compiler or due to a bug in
> user code (for example, returning a reference to a local variable).

shouldn't such compilers/code be fixed then?  I understand that you want
your assertion to be useful, but I'm worried that you are adding a costly
operation to work around broken programs.

> This commit adds checks that all of the instructions in the function and
> invalidates lifetime ranges which do not contain all of the instructions.

This sounds like it might be expensive, is it?  Do you plan to remove this
one day - or maybe it can be conditioned on some "check lifetime" option
which would also turn on your check.

Ciao, Duncan.

>
>
> Modified:
>      llvm/trunk/lib/CodeGen/StackColoring.cpp
>      llvm/trunk/test/CodeGen/X86/StackColoring.ll
>
> Modified: llvm/trunk/lib/CodeGen/StackColoring.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackColoring.cpp?rev=163678&r1=163677&r2=163678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/StackColoring.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StackColoring.cpp Tue Sep 11 23:57:37 2012
> @@ -158,6 +158,14 @@
>     /// slots to use the joint slots.
>     void remapInstructions(DenseMap<int, int> &SlotRemap);
>
> +  /// The input program may contain intructions which are not inside lifetime
> +  /// markers. This can happen due to a bug in the compiler or due to a bug in
> +  /// user code (for example, returning a reference to a local variable).
> +  /// This procedure checks all of the instructions in the function and
> +  /// invalidates lifetime ranges which do not contain all of the instructions
> +  /// which access that frame slot.
> +  void removeInvalidSlotRanges();
> +
>     /// Map entries which point to other entries to their destination.
>     ///   A->B->C becomes A->C.
>      void expungeSlotMap(DenseMap<int, int> &SlotRemap, unsigned NumSlots);
> @@ -543,6 +551,43 @@
>     DEBUG(dbgs()<<"Fixed "<<FixedInstr<<" machine instructions.\n");
>   }
>
> +void StackColoring::removeInvalidSlotRanges() {
> +  MachineFunction::iterator BB, BBE;
> +  MachineBasicBlock::iterator I, IE;
> +  for (BB = MF->begin(), BBE = MF->end(); BB != BBE; ++BB)
> +    for (I = BB->begin(), IE = BB->end(); I != IE; ++I) {
> +
> +      if (I->getOpcode() == TargetOpcode::LIFETIME_START ||
> +          I->getOpcode() == TargetOpcode::LIFETIME_END || I->isDebugValue())
> +        continue;
> +
> +      // Check all of the machine operands.
> +      for (unsigned i = 0 ; i <  I->getNumOperands(); ++i) {
> +        MachineOperand &MO = I->getOperand(i);
> +
> +        if (!MO.isFI())
> +          continue;
> +
> +        int Slot = MO.getIndex();
> +
> +        if (Slot<0)
> +          continue;
> +
> +        if (Intervals[Slot]->empty())
> +          continue;
> +
> +        // Check that the used slot is inside the calculated lifetime range.
> +        // If it is not, warn about it and invalidate the range.
> +        LiveInterval *Interval = Intervals[Slot];
> +        SlotIndex Index = Indexes->getInstructionIndex(I);
> +        if (Interval->find(Index) == Interval->end()) {
> +          Intervals[Slot]->clear();
> +          DEBUG(dbgs()<<"Invalidating range #"<<Slot<<"\n");
> +        }
> +      }
> +    }
> +}
> +
>   void StackColoring::expungeSlotMap(DenseMap<int, int> &SlotRemap,
>                                      unsigned NumSlots) {
>     // Expunge slot remap map.
> @@ -617,6 +662,8 @@
>     // Propagate the liveness information.
>     calculateLiveIntervals(NumSlots);
>
> +  removeInvalidSlotRanges();
> +
>     // Maps old slots to new slots.
>     DenseMap<int, int> SlotRemap;
>     unsigned RemovedSlots = 0;
>
> Modified: llvm/trunk/test/CodeGen/X86/StackColoring.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/StackColoring.ll?rev=163678&r1=163677&r2=163678&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/StackColoring.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/StackColoring.ll Tue Sep 11 23:57:37 2012
> @@ -7,7 +7,6 @@
>   ;YESCOLOR: subq  $136, %rsp
>   ;NOCOLOR: subq  $264, %rsp
>
> -
>   define i32 @myCall_w2(i32 %in) {
>   entry:
>     %a = alloca [17 x i8*], align 8
> @@ -328,7 +327,6 @@
>
>   ;YESCOLOR: subq  $272, %rsp
>   ;NOCOLOR: subq  $272, %rsp
> -
>   define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
>   entry:
>     %a = alloca [17 x i8*], align 8
> @@ -352,11 +350,37 @@
>     ret i32 0
>   }
>
> +; Check that we don't assert and crash even when there are allocas
> +; outside the declared lifetime regions.
> +;YESCOLOR: bad_range
> +;NOCOLOR:  bad_range
> +define void @bad_range() nounwind ssp {
> +entry:
> +  %A.i1 = alloca [100 x i32], align 4
> +  %B.i2 = alloca [100 x i32], align 4
> +  %A.i = alloca [100 x i32], align 4
> +  %B.i = alloca [100 x i32], align 4
> +  %0 = bitcast [100 x i32]* %A.i to i8*
> +  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
> +  %1 = bitcast [100 x i32]* %B.i to i8*
> +  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
> +  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
> +  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
> +  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
> +  br label %block2
> +
> +block2:
> +  ; I am used outside the marked lifetime.
> +  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
> +  ret void
> +}
> +
> +
>   declare void @bar([100 x i32]* , [100 x i32]*) nounwind
>
>   declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
>
>   declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
>
> - declare i32 @foo(i32, i8*)
> +declare i32 @foo(i32, i8*)
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list