[GVN][NFC] Precommit intrinsic bug test case, see D141190
authorJohannes Doerfert <johannes@jdoerfert.de>
Mon, 9 Jan 2023 22:14:01 +0000 (14:14 -0800)
committerJohannes Doerfert <johannes@jdoerfert.de>
Tue, 10 Jan 2023 00:03:51 +0000 (16:03 -0800)
llvm/test/Transforms/GVN/intrinsics_in_cg.ll [new file with mode: 0644]

diff --git a/llvm/test/Transforms/GVN/intrinsics_in_cg.ll b/llvm/test/Transforms/GVN/intrinsics_in_cg.ll
new file mode 100644 (file)
index 0000000..19e4907
--- /dev/null
@@ -0,0 +1,67 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
+; RUN: opt < %s -passes='require<globals-aa>,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()
+