diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2015-07-01 18:10:20 +0000 | 
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2015-07-01 18:10:20 +0000 | 
| commit | 943829a1adb5d18be532f1f747275a01285720f3 (patch) | |
| tree | 55d14047cc019d0325a951a4be60fd74a312216f | |
| parent | 0e9ff6972c9a19bd0491f5fb6e28b1bd956c6b0f (diff) | |
| download | bcm5719-llvm-943829a1adb5d18be532f1f747275a01285720f3.tar.gz bcm5719-llvm-943829a1adb5d18be532f1f747275a01285720f3.zip  | |
add a cl::opt override for TargetLoweringBase's JumpIsExpensive
This patch is not intended to change existing codegen behavior for any target. 
It just exposes the JumpIsExpensive setting on the command-line to allow for
easier testing and emergency overrides.
Also, change the existing regression test to use FileCheck, explicitly specify
the jump-is-expensive option, and use more precise checks.
Differential Revision: http://reviews.llvm.org/D10846
llvm-svn: 241179
| -rw-r--r-- | llvm/include/llvm/Target/TargetLowering.h | 9 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 13 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/or-branch.ll | 31 | 
3 files changed, 36 insertions, 17 deletions
diff --git a/llvm/include/llvm/Target/TargetLowering.h b/llvm/include/llvm/Target/TargetLowering.h index 80826cb6c3e..277487fee6b 100644 --- a/llvm/include/llvm/Target/TargetLowering.h +++ b/llvm/include/llvm/Target/TargetLowering.h @@ -1235,11 +1235,10 @@ protected:      HasExtractBitsInsn = hasExtractInsn;    } -  /// Tells the code generator not to expand sequence of operations into a -  /// separate sequences that increases the amount of flow control. -  void setJumpIsExpensive(bool isExpensive = true) { -    JumpIsExpensive = isExpensive; -  } +  /// Tells the code generator not to expand logic operations on comparison +  /// predicates into separate sequences that increase the amount of flow +  /// control. +  void setJumpIsExpensive(bool isExpensive = true);    /// Tells the code generator that integer divide is expensive, and if    /// possible, should be replaced by an alternate sequence of instructions not diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 53f3b00789c..78492a6e881 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -38,6 +38,11 @@  #include <cctype>  using namespace llvm; +static cl::opt<bool> JumpIsExpensiveOverride( +    "jump-is-expensive", cl::init(false), +    cl::desc("Do not create extra branches to split comparison logic."), +    cl::Hidden); +  /// InitLibcallNames - Set default libcall names.  ///  static void InitLibcallNames(const char **Names, const Triple &TT) { @@ -757,7 +762,7 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm) : TM(tm) {    IntDivIsCheap = false;    FsqrtIsCheap = false;    Pow2SDivIsCheap = false; -  JumpIsExpensive = false; +  JumpIsExpensive = JumpIsExpensiveOverride;    PredictableSelectIsExpensive = false;    MaskAndBranchFoldingIsLegal = false;    EnableExtLdPromotion = false; @@ -915,6 +920,12 @@ bool TargetLoweringBase::canOpTrap(unsigned Op, EVT VT) const {    }  } +void TargetLoweringBase::setJumpIsExpensive(bool isExpensive) { +  // If the command-line option was specified, ignore this request. +  if (!JumpIsExpensiveOverride.getNumOccurrences()) +    JumpIsExpensive = isExpensive; +} +  TargetLoweringBase::LegalizeKind  TargetLoweringBase::getTypeConversion(LLVMContext &Context, EVT VT) const {    // If this is a simple type, use the ComputeRegisterProp mechanism. diff --git a/llvm/test/CodeGen/X86/or-branch.ll b/llvm/test/CodeGen/X86/or-branch.ll index ae3ed3f8344..9db948adb46 100644 --- a/llvm/test/CodeGen/X86/or-branch.ll +++ b/llvm/test/CodeGen/X86/or-branch.ll @@ -1,19 +1,28 @@ -; RUN: llc < %s -march=x86  | not grep set +; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=0 | FileCheck %s --check-prefix=JUMP2 +; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=1 | FileCheck %s --check-prefix=JUMP1  define void @foo(i32 %X, i32 %Y, i32 %Z) nounwind { +; JUMP2-LABEL: foo: +; JUMP2-DAG:     jl +; JUMP2-DAG:     je +; +; JUMP1-LABEL: foo: +; JUMP1-DAG:     sete +; JUMP1-DAG:     setl +; JUMP1:         orb +; JUMP1:         jne  entry: -	%tmp = tail call i32 (...) @bar( )		; <i32> [#uses=0] -	%tmp.upgrd.1 = icmp eq i32 %X, 0		; <i1> [#uses=1] -	%tmp3 = icmp slt i32 %Y, 5		; <i1> [#uses=1] -	%tmp4 = or i1 %tmp3, %tmp.upgrd.1		; <i1> [#uses=1] -	br i1 %tmp4, label %cond_true, label %UnifiedReturnBlock +  %tmp1 = icmp eq i32 %X, 0 +  %tmp3 = icmp slt i32 %Y, 5 +  %tmp4 = or i1 %tmp3, %tmp1 +  br i1 %tmp4, label %cond_true, label %UnifiedReturnBlock -cond_true:		; preds = %entry -	%tmp5 = tail call i32 (...) @bar( )		; <i32> [#uses=0] -	ret void +cond_true: +  %tmp5 = tail call i32 (...) @bar( ) +  ret void -UnifiedReturnBlock:		; preds = %entry -	ret void +UnifiedReturnBlock: +  ret void  }  declare i32 @bar(...)  | 

