From c586d973105d80da0c4d8e8f27f3ee0792beac15 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Mon, 9 Jan 2023 14:14:01 -0800 Subject: [PATCH] [GVN][NFC] Precommit intrinsic bug test case, see D141190 --- llvm/test/Transforms/GVN/intrinsics_in_cg.ll | 67 ++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 llvm/test/Transforms/GVN/intrinsics_in_cg.ll diff --git a/llvm/test/Transforms/GVN/intrinsics_in_cg.ll b/llvm/test/Transforms/GVN/intrinsics_in_cg.ll new file mode 100644 index 0000000..19e4907 --- /dev/null +++ b/llvm/test/Transforms/GVN/intrinsics_in_cg.ll @@ -0,0 +1,67 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature +; RUN: opt < %s -passes='require,gvn' -S | FileCheck %s + +; Ensure we do not hoist the load over the call. +; FIXME: Currently broken until D141190 or similar lands. + +@G1 = internal global i32 1 +@G2 = internal global i32 1 + +define i32 @direct_intrinsic(i1 %c) { +; CHECK-LABEL: define {{[^@]+}}@direct_intrinsic +; CHECK-SAME: (i1 [[C:%.*]]) { +; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[CHECK:%.*]] +; CHECK: init: +; CHECK-NEXT: store i32 0, ptr @G1, align 4 +; CHECK-NEXT: br label [[CHECK]] +; CHECK: check: +; CHECK-NEXT: call void @llvm.unknown() +; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G1, align 4 +; CHECK-NEXT: ret i32 [[V]] +; + br i1 %c, label %init, label %check +init: + store i32 0, ptr @G1 + br label %check +check: + call void @llvm.unknown() + %v = load i32, ptr @G1 + ret i32 %v +} + +define i32 @indirect_intrinsic(i1 %c) { +; CHECK-LABEL: define {{[^@]+}}@indirect_intrinsic +; CHECK-SAME: (i1 [[C:%.*]]) { +; CHECK-NEXT: br i1 [[C]], label [[INIT:%.*]], label [[DOTCHECK_CRIT_EDGE:%.*]] +; CHECK: .check_crit_edge: +; CHECK-NEXT: [[V_PRE:%.*]] = load i32, ptr @G2, align 4 +; CHECK-NEXT: br label [[CHECK:%.*]] +; CHECK: init: +; CHECK-NEXT: store i32 0, ptr @G2, align 4 +; CHECK-NEXT: br label [[CHECK]] +; CHECK: check: +; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[V_PRE]], [[DOTCHECK_CRIT_EDGE]] ], [ 0, [[INIT]] ] +; CHECK-NEXT: call void @intrinsic_caller() +; CHECK-NEXT: ret i32 [[V]] +; + br i1 %c, label %init, label %check +init: + store i32 0, ptr @G2 + br label %check +check: + call void @intrinsic_caller() + %v = load i32, ptr @G2 + ret i32 %v +} + +define fastcc void @intrinsic_caller() { +; CHECK-LABEL: define {{[^@]+}}@intrinsic_caller() { +; CHECK-NEXT: call void @llvm.unknown() +; CHECK-NEXT: ret void +; + call void @llvm.unknown() + ret void +} + +declare void @llvm.unknown() + -- 2.7.4