[PATCH] D14500: [MIPS] add overrides for isCheapToSpeculateCttz() and isCheapToSpeculateCtlz()

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 9 09:27:20 PST 2015


spatel created this revision.
spatel added a reviewer: dsanders.
spatel added a subscriber: llvm-commits.
Herald added a subscriber: dsanders.

MIPS is using the default TLI cost settings for count-leading/trailing-zeros. I think these are considered cheap operations (and therefore fair game for speculation) for any MIPS implementation.

The net result of allowing this speculation for the MIPS regression tests in this patch is that we get this branchless code:
  ctlz:
    jr  $ra
    clz  $2, $4
  cttz:
    addiu  $1, $4, -1
    not  $2, $4
    and  $1, $2, $1
    clz  $1, $1
    addiu  $2, $zero, 32
    jr  $ra
    subu  $2, $2, $1

Instead of:
  ctlz:
    beqz  $4, $BB0_2
    addiu  $2, $zero, 32
    clz  $2, $4
  $BB0_2:
    jr  $ra
    nop
  cttz:
    beqz  $4, $BB1_2
    addiu  $2, $zero, 32
    addiu  $1, $4, -1
    not  $2, $4
    and  $1, $2, $1
    clz  $1, $1
    addiu  $2, $zero, 32
    subu  $2, $2, $1
  $BB1_2:
    jr  $ra
    nop

See D14469 for the larger motivation.

http://reviews.llvm.org/D14500

Files:
  lib/Target/Mips/MipsISelLowering.h
  test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll
  test/Transforms/SimplifyCFG/Mips/lit.local.cfg

Index: test/Transforms/SimplifyCFG/Mips/lit.local.cfg
===================================================================
--- test/Transforms/SimplifyCFG/Mips/lit.local.cfg
+++ test/Transforms/SimplifyCFG/Mips/lit.local.cfg
@@ -0,0 +1,5 @@
+config.suffixes = ['.ll']
+
+targets = set(config.root.targets_to_build.split())
+if not 'Mips' in targets:
+    config.unsupported = True
Index: test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll
===================================================================
--- test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll
+++ test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll
@@ -0,0 +1,43 @@
+; RUN: opt -S -simplifycfg -mtriple=mips < %s | FileCheck %s
+
+define i32 @ctlz(i32 %A) {
+; CHECK-LABEL: @ctlz(
+; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
+; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
+; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]]
+; CHECK-NEXT: ret i32 [[SEL]]
+entry:
+  %tobool = icmp eq i32 %A, 0
+  br i1 %tobool, label %cond.end, label %cond.true
+
+cond.true:
+  %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
+  br label %cond.end
+
+cond.end:
+  %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ]
+  ret i32 %cond
+}
+
+define i32 @cttz(i32 %A) {
+; CHECK-LABEL: @cttz(
+; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
+; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
+; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]]
+; CHECK-NEXT: ret i32 [[SEL]]
+entry:
+  %tobool = icmp eq i32 %A, 0
+  br i1 %tobool, label %cond.end, label %cond.true
+
+cond.true:
+  %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
+  br label %cond.end
+
+cond.end:
+  %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ]
+  ret i32 %cond
+}
+
+declare i32 @llvm.ctlz.i32(i32, i1)
+declare i32 @llvm.cttz.i32(i32, i1)
+
Index: lib/Target/Mips/MipsISelLowering.h
===================================================================
--- lib/Target/Mips/MipsISelLowering.h
+++ lib/Target/Mips/MipsISelLowering.h
@@ -235,6 +235,14 @@
       return MVT::i32;
     }
 
+    bool isCheapToSpeculateCttz() const override {
+      return true;
+    }
+
+    bool isCheapToSpeculateCtlz() const override {
+      return true;
+    }
+
     void LowerOperationWrapper(SDNode *N,
                                SmallVectorImpl<SDValue> &Results,
                                SelectionDAG &DAG) const override;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14500.39708.patch
Type: text/x-patch
Size: 2479 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151109/1f47cfb3/attachment.bin>


More information about the llvm-commits mailing list