[llvm-commits] [PATCH] Clear unknown mem ops when merging stack slots (pr14090)

Duncan Sands baldrick at free.fr
Wed Oct 17 12:17:04 PDT 2012


Hi Matthew Curtis,
> --- a/lib/CodeGen/StackColoring.cpp
> +++ b/lib/CodeGen/StackColoring.cpp
> @@ -48,6 +48,7 @@
>  #include "llvm/CodeGen/Passes.h"
>  #include "llvm/CodeGen/SlotIndexes.h"
>  #include "llvm/DebugInfo.h"
> +#include "llvm/Instructions.h"
>  #include "llvm/MC/MCInstrItineraries.h"
>  #include "llvm/Target/TargetInstrInfo.h"
>  #include "llvm/Target/TargetRegisterInfo.h"
> @@ -511,14 +512,18 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
>            continue;
>
>          // Climb up and find the original alloca.
> -        V = GetUnderlyingObject(V);
> -        // If we did not find one, or if the one that we found is not in our
> -        // map, then move on.
> -        if (!V || !Allocas.count(V))
> -          continue;
> -
> -        MMO->setValue(Allocas[V]);
> -        FixedMemOp++;
> +        const Value *UO = GetUnderlyingObject(V);
> +
> +        // Update value if it is in our map. Otherwise we may need to clear it
> +        // if we don't know for sure that it doesn't alias a merged alloca.
> +        DenseMap<const Value*, const Value*>::iterator NewV = Allocas.find(UO);

If this map only contains AllocaInst's as the name suggests, then it would be
cheaper to first check if UO is an AllocaInst or not, and only do the map lookup
if it is one.  Likewise for the null check: no point in doing a lookup if UO is
none.

Ciao, Duncan.

> +        if (NewV != Allocas.end())
> +          V = NewV->second;
> +        else if (!UO || !isa<AllocaInst>(UO))
> +          V = 0;
> +
> +        MMO->setValue(V);
> +        FixedMemOp += (V != 0);
>        }
>
>        // Update all of the machine instruction operands.
> diff --git a/test/CodeGen/X86/pr14090.ll b/test/CodeGen/X86/pr14090.ll
> new file mode 100644
> index 0000000..d76b912
> --- /dev/null
> +++ b/test/CodeGen/X86/pr14090.ll
> @@ -0,0 +1,76 @@
> +; RUN: llc < %s -march=x86-64 -print-before=stack-coloring -print-after=stack-coloring >%t 2>&1 && FileCheck <%t %s
> +
> +define void @foo(i64* %retval.i, i32 %call, i32* %.ph.i80, i32 %fourteen, i32* %out.lo, i32* %out.hi) nounwind align 2 {
> +entry:
> +  %_Tmp.i39 = alloca i64, align 8
> +  %retval.i33 = alloca i64, align 8
> +  %_Tmp.i = alloca i64, align 8
> +  %retval.i.i = alloca i64, align 8
> +  %_First.i = alloca i64, align 8
> +
> +  %0 = load i64* %retval.i, align 8
> +
> +  %1 = load i64* %retval.i, align 8
> +
> +  %_Tmp.i39.0.cast73 = bitcast i64* %_Tmp.i39 to i8*
> +  call void @llvm.lifetime.start(i64 8, i8* %_Tmp.i39.0.cast73)
> +  store i64 %1, i64* %_Tmp.i39, align 8
> +  %cmp.i.i.i40 = icmp slt i32 %call, 0
> +  %2 = lshr i64 %1, 32
> +  %3 = trunc i64 %2 to i32
> +  %sub.i.i.i44 = sub i32 0, %call
> +  %cmp2.i.i.i45 = icmp ult i32 %3, %sub.i.i.i44
> +  %or.cond.i.i.i46 = and i1 %cmp.i.i.i40, %cmp2.i.i.i45
> +  %add.i.i.i47 = add i32 %3, %call
> +  %sub5.i.i.i48 = lshr i32 %add.i.i.i47, 5
> +  %trunc.i50 = trunc i64 %1 to i32
> +  %inttoptr.i51 = inttoptr i32 %trunc.i50 to i32*
> +  %add61617.i.i.i52 = or i32 %sub5.i.i.i48, -134217728
> +  %add61617.i.sub5.i.i.i53 = select i1 %or.cond.i.i.i46, i32 %add61617.i.i.i52, i32 %sub5.i.i.i48
> +  %storemerge2.i.i54 = getelementptr inbounds i32* %inttoptr.i51, i32 %add61617.i.sub5.i.i.i53
> +  %_Tmp.i39.0.cast74 = bitcast i64* %_Tmp.i39 to i32**
> +  store i32* %storemerge2.i.i54, i32** %_Tmp.i39.0.cast74, align 8
> +  %storemerge.i.i55 = and i32 %add.i.i.i47, 31
> +  %_Tmp.i39.4.raw_idx = getelementptr inbounds i8* %_Tmp.i39.0.cast73, i32 4
> +  %_Tmp.i39.4.cast = bitcast i8* %_Tmp.i39.4.raw_idx to i32*
> +  store i32 %storemerge.i.i55, i32* %_Tmp.i39.4.cast, align 4
> +  %srcval.i56 = load i64* %_Tmp.i39, align 8
> +  call void @llvm.lifetime.end(i64 8, i8* %_Tmp.i39.0.cast73)
> +
> +; CHECK: Before Merge disjoint stack slots
> +; CHECK: [[PREFIX15:MOV64mr.*<fi#]]{{[0-9]}}[[SUFFIX15:.*;]] mem:ST8[%fifteen]
> +; CHECK: [[PREFIX87:MOV32mr.*;]] mem:ST4[%sunkaddr87]
> +
> +; CHECK: After Merge disjoint stack slots
> +; CHECK: [[PREFIX15]]{{[0-9]}}[[SUFFIX15]] mem:ST8[%_Tmp.i39]
> +; CHECK: [[PREFIX87]] mem:ST4[<unknown>]
> +
> +  %fifteen = bitcast i64* %retval.i.i to i32**
> +  %sixteen = bitcast i64* %retval.i.i to i8*
> +  call void @llvm.lifetime.start(i64 8, i8* %sixteen)
> +  store i32* %.ph.i80, i32** %fifteen, align 8, !tbaa !0
> +  %sunkaddr = ptrtoint i64* %retval.i.i to i32
> +  %sunkaddr86 = add i32 %sunkaddr, 4
> +  %sunkaddr87 = inttoptr i32 %sunkaddr86 to i32*
> +  store i32 %fourteen, i32* %sunkaddr87, align 4, !tbaa !3
> +  %seventeen = load i64* %retval.i.i, align 8
> +  call void @llvm.lifetime.end(i64 8, i8* %sixteen)
> +  %eighteen = lshr i64 %seventeen, 32
> +  %nineteen = trunc i64 %eighteen to i32
> +  %shl.i.i.i = shl i32 1, %nineteen
> +
> +  store i32 %shl.i.i.i, i32* %out.lo, align 8
> +  store i32 %nineteen, i32* %out.hi, align 8
> +
> +  ret void
> +}
> +
> +declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
> +
> +declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
> +
> +!0 = metadata !{metadata !"int", metadata !1}
> +!1 = metadata !{metadata !"omnipotent char", metadata !2}
> +!2 = metadata !{metadata !"Simple C/C++ TBAA"}
> +!3 = metadata !{metadata !"any pointer", metadata !1}
> +!4 = metadata !{metadata !"vtable pointer", metadata !2}
> -- 1.7.8.3
>
>
>
> _______________________________________________
> 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