[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