[PATCH] Set edge weights in stack protector pass

Duncan P. N. Exon Smith dexonsmith at apple.com
Fri Nov 21 11:40:00 PST 2014


> On 2014-Nov-03, at 13:04, Akira Hatanaka <ahatanak at gmail.com> wrote:
> 
> ping
> 
> http://reviews.llvm.org/D5766
> 

LGTM with a few nitpicks.

> Index: include/llvm/Analysis/BranchProbabilityInfo.h
> ===================================================================
> --- include/llvm/Analysis/BranchProbabilityInfo.h
> +++ include/llvm/Analysis/BranchProbabilityInfo.h
> @@ -111,6 +111,10 @@
>    void setEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors,
>                       uint32_t Weight);
>  
> +  static uint32_t getBranchWeightStackProtector(bool Likely) {
> +    return Likely ? 1024*1024 - 1 : 1;

`IsLikely` is a better name, and `1024*1024` should have spaces around
the `*`.

Bike shed: I personally find `(1u << 20) - 1` less magical :).

> +  }
> +
>  private:
>    // Since we allow duplicate edges from one basic block to another, we use
>    // a pair (PredBlock and an index in the successors) to specify an edge.
> Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> +++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> @@ -7739,6 +7739,7 @@
>  SelectionDAGBuilder::StackProtectorDescriptor::
>  AddSuccessorMBB(const BasicBlock *BB,
>                  MachineBasicBlock *ParentMBB,
> +                bool Likely,

Same name change here.

>                  MachineBasicBlock *SuccMBB) {
>    // If SuccBB has not been created yet, create it.
>    if (!SuccMBB) {
> @@ -7748,6 +7749,7 @@
>      MF->insert(++BBI, SuccMBB);
>    }
>    // Add it as a successor of ParentMBB.
> -  ParentMBB->addSuccessor(SuccMBB);
> +  ParentMBB->addSuccessor(
> +      SuccMBB, BranchProbabilityInfo::getBranchWeightStackProtector(Likely));
>    return SuccMBB;
>  }
> Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> +++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
> @@ -416,8 +416,8 @@
>        assert(!shouldEmitStackProtector() && "Stack Protector Descriptor is "
>               "already initialized!");
>        ParentMBB = MBB;
> -      SuccessMBB = AddSuccessorMBB(BB, MBB);
> -      FailureMBB = AddSuccessorMBB(BB, MBB, FailureMBB);
> +      SuccessMBB = AddSuccessorMBB(BB, MBB, true);
> +      FailureMBB = AddSuccessorMBB(BB, MBB, false, FailureMBB);

I think these should have `/* IsLikely */` comments:

    SuccessMBB = AddSuccessorMBB(BB, MBB, /* IsLikely */ true);
    FailureMBB = AddSuccessorMBB(BB, MBB, /* IsLikely */ false, FailureMBB);

>        if (!Guard)
>          Guard = StackProtCheckCall.getArgOperand(0);
>      }
> @@ -488,7 +488,7 @@
>      /// has not been created yet (i.e. if SuccMBB = 0), then the machine basic
>      /// block will be created.
>      MachineBasicBlock *AddSuccessorMBB(const BasicBlock *BB,
> -                                       MachineBasicBlock *ParentMBB,
> +                                       MachineBasicBlock *ParentMBB, bool Likely,

Same name change.  Also, you should update the doxygen to explain the
variable.

>                                         MachineBasicBlock *SuccMBB = nullptr);
>    };
>  
> Index: lib/CodeGen/StackProtector.cpp
> ===================================================================
> --- lib/CodeGen/StackProtector.cpp
> +++ lib/CodeGen/StackProtector.cpp
> @@ -17,6 +17,7 @@
>  #include "llvm/CodeGen/StackProtector.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/Statistic.h"
> +#include "llvm/Analysis/BranchProbabilityInfo.h"
>  #include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/CodeGen/Analysis.h"
>  #include "llvm/CodeGen/Passes.h"
> @@ -31,6 +32,7 @@
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/IR/IntrinsicInst.h"
>  #include "llvm/IR/Intrinsics.h"
> +#include "llvm/IR/MDBuilder.h"
>  #include "llvm/IR/Module.h"
>  #include "llvm/Support/CommandLine.h"
>  #include "llvm/Target/TargetSubtargetInfo.h"
> @@ -459,7 +461,13 @@
>        LoadInst *LI1 = B.CreateLoad(StackGuardVar);
>        LoadInst *LI2 = B.CreateLoad(AI);
>        Value *Cmp = B.CreateICmpEQ(LI1, LI2);
> -      B.CreateCondBr(Cmp, NewBB, FailBB);
> +      unsigned SuccessWeight =
> +          BranchProbabilityInfo::getBranchWeightStackProtector(true);
> +      unsigned FailureWeight =
> +          BranchProbabilityInfo::getBranchWeightStackProtector(false);
> +      MDNode *Weights = MDBuilder(F->getContext())
> +                            .createBranchWeights(SuccessWeight, FailureWeight);
> +      B.CreateCondBr(Cmp, NewBB, FailBB, Weights);
>      }
>    }
>  
> Index: test/CodeGen/X86/stack-protector-weight.ll
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/X86/stack-protector-weight.ll
> @@ -0,0 +1,36 @@
> +; RUN: llc -mtriple=x86_64-apple-darwin -print-machineinstrs=expand-isel-pseudos -enable-selectiondag-sp=true %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=SELDAG
> +; RUN: llc -mtriple=x86_64-apple-darwin -print-machineinstrs=expand-isel-pseudos -enable-selectiondag-sp=false %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=IR
> +
> +; SELDAG: # Machine code for function test_branch_weights:
> +; SELDAG: Successors according to CFG: BB#[[SUCCESS:[0-9]+]](1048575) BB#[[FAILURE:[0-9]+]](1)
> +; SELDAG: BB#[[FAILURE]]:
> +; SELDAG: CALL64pcrel32 <es:__stack_chk_fail>
> +; SELDAG: BB#[[SUCCESS]]:
> +
> +; IR: # Machine code for function test_branch_weights:
> +; IR: Successors according to CFG: BB#[[SUCCESS:[0-9]+]](1048575) BB#[[FAILURE:[0-9]+]](1)
> +; IR: BB#[[SUCCESS]]:
> +; IR: BB#[[FAILURE]]:
> +; IR: CALL64pcrel32 <ga:@__stack_chk_fail>
> +
> +define i32 @test_branch_weights(i32 %n) #0 {
> +entry:
> +  %a = alloca [128 x i32], align 16
> +  %0 = bitcast [128 x i32]* %a to i8*
> +  call void @llvm.lifetime.start(i64 512, i8* %0)
> +  %arraydecay = getelementptr inbounds [128 x i32]* %a, i64 0, i64 0
> +  call void @foo2(i32* %arraydecay)
> +  %idxprom = sext i32 %n to i64
> +  %arrayidx = getelementptr inbounds [128 x i32]* %a, i64 0, i64 %idxprom
> +  %1 = load i32* %arrayidx, align 4
> +  call void @llvm.lifetime.end(i64 512, i8* %0)
> +  ret i32 %1
> +}
> +
> +declare void @llvm.lifetime.start(i64, i8* nocapture)
> +
> +declare void @foo2(i32*)
> +
> +declare void @llvm.lifetime.end(i64, i8* nocapture)
> +
> +attributes #0 = { ssp "stack-protector-buffer-size"="8" }
> 





More information about the llvm-commits mailing list