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 = !{}