[llvm] 3a3ad9f - [SimplifyCFG][LICM] Add metadata speculation tests (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 22 06:32:59 PDT 2023
Author: Nikita Popov
Date: 2023-03-22T14:32:49+01:00
New Revision: 3a3ad9fe1811ebd7ff865b77f471d155d9a05ec8
URL: https://github.com/llvm/llvm-project/commit/3a3ad9fe1811ebd7ff865b77f471d155d9a05ec8
DIFF: https://github.com/llvm/llvm-project/commit/3a3ad9fe1811ebd7ff865b77f471d155d9a05ec8.diff
LOG: [SimplifyCFG][LICM] Add metadata speculation tests (NFC)
Added:
llvm/test/Transforms/LICM/hoist-metadata.ll
Modified:
llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/LICM/hoist-metadata.ll b/llvm/test/Transforms/LICM/hoist-metadata.ll
new file mode 100644
index 0000000000000..7c5ed1f7ae6fb
--- /dev/null
+++ b/llvm/test/Transforms/LICM/hoist-metadata.ll
@@ -0,0 +1,73 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
+; RUN: opt -S -passes=licm < %s| FileCheck %s
+
+declare void @foo(...) memory(none)
+
+define void @test_unconditional(i1 %c, ptr dereferenceable(8) align 8 %p) {
+; CHECK-LABEL: define void @test_unconditional
+; CHECK-SAME: (i1 [[C:%.*]], ptr align 8 dereferenceable(8) [[P:%.*]]) {
+; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0:![0-9]+]]
+; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[P]], align 8, !nonnull !1, !noundef !1
+; CHECK-NEXT: [[V3:%.*]] = load ptr, ptr [[P]], align 8, !dereferenceable !2, !align !2
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: call void @foo(i32 [[V1]], ptr [[V2]], ptr [[V3]])
+; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: ret void
+;
+ br label %loop
+
+loop:
+ %v1 = load i32, ptr %p, !range !{i32 0, i32 10}
+ %v2 = load ptr, ptr %p, !nonnull !{}, !noundef !{}
+ %v3 = load ptr, ptr %p, !align !{i64 4}, !dereferenceable !{i64 4}
+ call void @foo(i32 %v1, ptr %v2, ptr %v3)
+ br i1 %c, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+define void @test_conditional(i1 %c, i1 %c2, ptr dereferenceable(8) align 8 %p) {
+; CHECK-LABEL: define void @test_conditional
+; CHECK-SAME: (i1 [[C:%.*]], i1 [[C2:%.*]], ptr align 8 dereferenceable(8) [[P:%.*]]) {
+; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[P]], align 4
+; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr [[P]], align 8
+; CHECK-NEXT: [[V3:%.*]] = load ptr, ptr [[P]], align 8
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[LATCH:%.*]]
+; CHECK: if:
+; CHECK-NEXT: call void @foo(i32 [[V1]], ptr [[V2]], ptr [[V3]])
+; CHECK-NEXT: br label [[LATCH]]
+; CHECK: latch:
+; CHECK-NEXT: br i1 [[C2]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: ret void
+;
+ br label %loop
+
+loop:
+ br i1 %c, label %if, label %latch
+
+if:
+ %v1 = load i32, ptr %p, !range !{i32 0, i32 10}
+ %v2 = load ptr, ptr %p, !nonnull !{}, !noundef !{}
+ %v3 = load ptr, ptr %p, !align !{i64 4}, !dereferenceable !{i64 4}
+ call void @foo(i32 %v1, ptr %v2, ptr %v3)
+ br label %latch
+
+latch:
+ br i1 %c2, label %loop, label %exit
+
+exit:
+ ret void
+}
+;.
+; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(none) }
+;.
+; CHECK: [[RNG0]] = !{i32 0, i32 10}
+; CHECK: [[META1:![0-9]+]] = !{}
+; CHECK: [[META2:![0-9]+]] = !{i64 4}
+;.
diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll b/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
index 63ffdbb5a90d3..72f9f5b2f6fde 100644
--- a/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
+++ b/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
@@ -61,6 +61,64 @@ out:
ret void
}
+define i32 @speculate_range(i1 %c, ptr dereferenceable(8) align 8 %p) {
+; CHECK-LABEL: @speculate_range(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], i32 [[V]], i32 0
+; CHECK-NEXT: ret i32 [[SPEC_SELECT]]
+;
+entry:
+ br i1 %c, label %if, label %join
+
+if:
+ %v = load i32, ptr %p, !range !{i32 0, i32 10}
+ br label %join
+
+join:
+ %phi = phi i32 [ %v, %if ], [ 0, %entry ]
+ ret i32 %phi
+}
+
+define ptr @speculate_nonnull(i1 %c, ptr dereferenceable(8) align 8 %p) {
+; CHECK-LABEL: @speculate_nonnull(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[V:%.*]] = load ptr, ptr [[P:%.*]], align 8
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], ptr [[V]], ptr null
+; CHECK-NEXT: ret ptr [[SPEC_SELECT]]
+;
+entry:
+ br i1 %c, label %if, label %join
+
+if:
+ %v = load ptr, ptr %p, !nonnull !{}, !noundef !{}
+ br label %join
+
+join:
+ %phi = phi ptr [ %v, %if ], [ null, %entry ]
+ ret ptr %phi
+}
+
+
+define ptr @speculate_align(i1 %c, ptr dereferenceable(8) align 8 %p) {
+; CHECK-LABEL: @speculate_align(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[V:%.*]] = load ptr, ptr [[P:%.*]], align 8
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], ptr [[V]], ptr null
+; CHECK-NEXT: ret ptr [[SPEC_SELECT]]
+;
+entry:
+ br i1 %c, label %if, label %join
+
+if:
+ %v = load ptr, ptr %p, !align !{i64 4}, !dereferenceable !{i64 4}
+ br label %join
+
+join:
+ %phi = phi ptr [ %v, %if ], [ null, %entry ]
+ ret ptr %phi
+}
+
!0 = !{ i8 0, i8 1 }
!1 = !{ i8 3, i8 5 }
!2 = !{}
More information about the llvm-commits
mailing list