From d527ace7d92b3bbbbe0e74f871d94ca43af58df2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 3 Apr 2023 15:58:12 +0200 Subject: [PATCH] [GVN] Regenerate test checks (NFC) And add an additional metadata preservation test. --- llvm/test/Transforms/GVN/PRE/invariant-load.ll | 120 +++++++++++++++++++------ 1 file changed, 93 insertions(+), 27 deletions(-) diff --git a/llvm/test/Transforms/GVN/PRE/invariant-load.ll b/llvm/test/Transforms/GVN/PRE/invariant-load.ll index 686c40d..3d01026 100644 --- a/llvm/test/Transforms/GVN/PRE/invariant-load.ll +++ b/llvm/test/Transforms/GVN/PRE/invariant-load.ll @@ -1,10 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 ; Test if the !invariant.load metadata is maintained by GVN. ; RUN: opt -passes=gvn -S < %s | FileCheck %s define i32 @test1(ptr nocapture %p, ptr nocapture %q) { -; CHECK-LABEL: test1 -; CHECK: %x = load i32, ptr %p, align 4, !invariant.load !0 -; CHECK-NOT: %y = load +; CHECK-LABEL: define i32 @test1 +; CHECK-SAME: (ptr nocapture [[P:%.*]], ptr nocapture [[Q:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4, !invariant.load !0 +; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[X]] to i8 +; CHECK-NEXT: store i8 [[CONV]], ptr [[Q]], align 1 +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT: ret i32 [[ADD]] +; entry: %x = load i32, ptr %p, align 4, !invariant.load !0 %conv = trunc i32 %x to i8 @@ -15,9 +22,15 @@ entry: } define i32 @test2(ptr nocapture %p, ptr nocapture %q) { -; CHECK-LABEL: test2 -; CHECK-NOT: !invariant.load -; CHECK-NOT: %y = load +; CHECK-LABEL: define i32 @test2 +; CHECK-SAME: (ptr nocapture [[P:%.*]], ptr nocapture [[Q:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[X]] to i8 +; CHECK-NEXT: store i8 [[CONV]], ptr [[Q]], align 1 +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT: ret i32 [[ADD]] +; entry: %x = load i32, ptr %p, align 4 %conv = trunc i32 %x to i8 @@ -30,8 +43,16 @@ entry: ; With the invariant.load metadata, what would otherwise ; be a case for PRE becomes a full redundancy. define i32 @test3(i1 %cnd, ptr %p, ptr %q) { -; CHECK-LABEL: test3 -; CHECK-NOT: load +; CHECK-LABEL: define i32 @test3 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[CND]], label [[BB1:%.*]], label [[BB2:%.*]] +; CHECK: bb1: +; CHECK-NEXT: store i32 5, ptr [[Q]], align 4 +; CHECK-NEXT: br label [[BB2]] +; CHECK: bb2: +; CHECK-NEXT: ret i32 0 +; entry: %v1 = load i32, ptr %p br i1 %cnd, label %bb1, label %bb2 @@ -47,9 +68,22 @@ bb2: } ; This test is here to document a case which doesn't optimize -; as well as it could. +; as well as it could. define i32 @test4(i1 %cnd, ptr %p, ptr %q) { -; CHECK-LABEL: test4 +; CHECK-LABEL: define i32 @test4 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[P]], align 4, !invariant.load !0 +; CHECK-NEXT: br i1 [[CND]], label [[BB1:%.*]], label [[BB2:%.*]] +; CHECK: bb1: +; CHECK-NEXT: store i32 5, ptr [[Q]], align 4 +; CHECK-NEXT: [[V2_PRE:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: br label [[BB2]] +; CHECK: bb2: +; CHECK-NEXT: [[V2:%.*]] = phi i32 [ [[V2_PRE]], [[BB1]] ], [ [[V1]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[RES:%.*]] = sub i32 [[V1]], [[V2]] +; CHECK-NEXT: ret i32 [[RES]] +; ; %v2 is redundant, but GVN currently doesn't catch that entry: %v1 = load i32, ptr %p, !invariant.load !0 @@ -69,10 +103,12 @@ bb2: ; so that it contributes to value forwarding. Note ; that we could and should remove the store too. define i32 @test5(i1 %cnd, ptr %p) { -; CHECK-LABEL: test5 -; CHECK-LABEL: entry: -; CHECK-NEXT: store i32 5, ptr %p -; CHECK-NEXT: ret i32 5 +; CHECK-LABEL: define i32 @test5 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: store i32 5, ptr [[P]], align 4 +; CHECK-NEXT: ret i32 5 +; entry: %v1 = load i32, ptr %p, !invariant.load !0 store i32 5, ptr %p ;; must alias store, want to exploit @@ -85,10 +121,12 @@ declare void @foo() ; Clobbering (mayalias) stores, even in function calls, can be ignored define i32 @test6(i1 %cnd, ptr %p) { -; CHECK-LABEL: test6 -; CHECK-LABEL: entry: -; CHECK-NEXT: @foo -; CHECK-NEXT: ret i32 0 +; CHECK-LABEL: define i32 @test6 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: call void @foo() +; CHECK-NEXT: ret i32 0 +; entry: %v1 = load i32, ptr %p, !invariant.load !0 call void @foo() @@ -97,15 +135,17 @@ entry: ret i32 %res } -declare noalias ptr @bar(...) +declare noalias ptr @bar(...) ; Same as previous, but a function with a noalias result (since they're handled ; differently in MDA) define i32 @test7(i1 %cnd, ptr %p) { -; CHECK-LABEL: test7 -; CHECK-LABEL: entry: -; CHECK-NEXT: @bar -; CHECK-NEXT: ret i32 0 +; CHECK-LABEL: define i32 @test7 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call ptr (...) @bar(ptr [[P]]) +; CHECK-NEXT: ret i32 0 +; entry: %v1 = load i32, ptr %p, !invariant.load !0 call ptr (...) @bar(ptr %p) @@ -115,10 +155,21 @@ entry: } define i32 @test8(i1 %cnd, ptr %p) { -; CHECK-LABEL: test8 -; CHECK: @bar -; CHECK: load i32, ptr %p2, align 4, !invariant.load -; CHECK: br label %merge +; CHECK-LABEL: define i32 @test8 +; CHECK-SAME: (i1 [[CND:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[P]], align 4, !invariant.load !0 +; CHECK-NEXT: br i1 [[CND]], label [[TAKEN:%.*]], label [[MERGE:%.*]] +; CHECK: taken: +; CHECK-NEXT: [[P2:%.*]] = call ptr (...) @bar(ptr [[P]]) +; CHECK-NEXT: [[V2_PRE:%.*]] = load i32, ptr [[P2]], align 4, !invariant.load !0 +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[V2:%.*]] = phi i32 [ [[V1]], [[ENTRY:%.*]] ], [ [[V2_PRE]], [[TAKEN]] ] +; CHECK-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[ENTRY]] ], [ [[P2]], [[TAKEN]] ] +; CHECK-NEXT: [[RES:%.*]] = sub i32 [[V1]], [[V2]] +; CHECK-NEXT: ret i32 [[RES]] +; entry: %v1 = load i32, ptr %p, !invariant.load !0 br i1 %cnd, label %taken, label %merge @@ -132,5 +183,20 @@ merge: ret i32 %res } +define i32 @metadata_preservation(ptr nocapture %p, ptr nocapture %q) { +; CHECK-LABEL: define i32 @metadata_preservation +; CHECK-SAME: (ptr nocapture [[P:%.*]], ptr nocapture [[Q:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + %x = load i32, ptr %p, align 4, !invariant.load !0 + %y = load i32, ptr %p, align 4 + %add = add i32 %x, %y + ret i32 %add +} + !0 = !{ } -- 2.7.4