[PATCH] D149373: [NFC][LICM] Add test case on widenable condition hoisting opportunity

Aleksandr Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 27 12:17:21 PDT 2023


aleksandr.popov created this revision.
Herald added a subscriber: asbirlea.
Herald added a project: All.
aleksandr.popov requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

https://reviews.llvm.org/D149373

Files:
  llvm/test/Transforms/LICM/explicit_guards.ll


Index: llvm/test/Transforms/LICM/explicit_guards.ll
===================================================================
--- llvm/test/Transforms/LICM/explicit_guards.ll
+++ llvm/test/Transforms/LICM/explicit_guards.ll
@@ -125,3 +125,53 @@
 exit:
   ret void
 }
+
+; TODO: Hoist widenable condition out of loop since it's the only
+; non-invariant operand of its user
+define void @hoist_widenable_cond(ptr %p, i32 %x) {
+; CHECK-LABEL: @hoist_widenable_cond(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[LOAD:%.*]] = load atomic i32, ptr [[P:%.*]] unordered, align 8
+; CHECK-NEXT:    [[ICMP7:%.*]] = icmp ult i32 0, [[LOAD]]
+; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
+; CHECK:       loop.header:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[ICMP:%.*]] = icmp ult i32 [[IV]], [[X:%.*]]
+; CHECK-NEXT:    br i1 [[ICMP]], label [[LOOP_BODY:%.*]], label [[EXIT:%.*]]
+; CHECK:       loop.body:
+; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
+; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[ICMP7]], [[WIDENABLE_COND]]
+; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED1:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
+; CHECK:       deopt:
+; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) [ "deopt"() ]
+; CHECK-NEXT:    ret void
+; CHECK:       guarded1:
+; CHECK-NEXT:    br label [[GUARDED]]
+; CHECK:       guarded:
+; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
+; CHECK-NEXT:    br label [[LOOP_HEADER]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %load = load atomic i32, ptr %p unordered, align 8
+  br label %loop.header
+
+loop.header:
+  %iv = phi i32 [ %iv.next, %guarded ], [ 0, %entry ]
+  %icmp = icmp ult i32 %iv, %x
+  br i1 %icmp, label %loop.body, label %exit
+
+loop.body:
+  %icmp7 = icmp ult i32 0, %load
+  call void (i1, ...) @llvm.experimental.guard(i1 %icmp7, i32 13) [ "deopt"() ]
+  %add = add nuw nsw i32 %iv, 1
+  br label %guarded
+
+guarded:
+  %iv.next = add nuw nsw i32 %iv, 1
+  br label %loop.header
+
+exit:
+  ret void
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149373.517672.patch
Type: text/x-patch
Size: 2159 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230427/a3be8352/attachment.bin>


More information about the llvm-commits mailing list