[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