[llvm] d69ffe6 - [NewGVN] Precommit test (#141362)

via llvm-commits llvm-commits at lists.llvm.org
Mon May 26 03:29:44 PDT 2025


Author: ManuelJBrito
Date: 2025-05-26T11:29:41+01:00
New Revision: d69ffe6e48ca65ea05409a5cfb9386241670af59

URL: https://github.com/llvm/llvm-project/commit/d69ffe6e48ca65ea05409a5cfb9386241670af59
DIFF: https://github.com/llvm/llvm-project/commit/d69ffe6e48ca65ea05409a5cfb9386241670af59.diff

LOG: [NewGVN] Precommit test (#141362)

Following 14dee0a and 3416d4f  the first function gets miscompiled.

Added: 
    llvm/test/Transforms/NewGVN/coercion-different-ptr.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/NewGVN/coercion-
diff erent-ptr.ll b/llvm/test/Transforms/NewGVN/coercion-
diff erent-ptr.ll
new file mode 100644
index 0000000000000..61a6a633788e1
--- /dev/null
+++ b/llvm/test/Transforms/NewGVN/coercion-
diff erent-ptr.ll
@@ -0,0 +1,53 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -passes=newgvn < %s | FileCheck %s
+
+
+; FIXME: MemorySSA says that load1 depends on the lifetime start.
+; That's OK since MemorySSA is may-alias; however, NewGVN should
+; check whether the lifetime start *actually* defines the loaded pointer
+; before simplifying to uninitialized memory.
+define void @foo(ptr %arg) {
+; CHECK-LABEL: define void @foo(
+; CHECK-SAME: ptr [[ARG:%.*]]) {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca i8, align 16
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[ALLOCA]])
+; CHECK-NEXT:    [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8
+; CHECK-NEXT:    [[CALL:%.*]] = call ptr undef(ptr [[ALLOCA]])
+; CHECK-NEXT:    ret void
+;
+bb:
+  %alloca = alloca i8, align 16
+  call void @llvm.lifetime.start.p0(i64 1, ptr %alloca)
+  %load = load ptr, ptr %arg, align 8
+  %load1 = load ptr, ptr %load, align 8
+  %call = call ptr %load1(ptr %alloca)
+  ret void
+}
+
+declare void @llvm.lifetime.start.p0(i64 immarg, ptr captures(none)) #0
+
+declare ptr @malloc(i64)
+
+; This case is handled correctly. 
+; Since malloc returns a pointer, NewGVN checks whether
+; it is the same pointer, an equivalent one, or a must-alias.
+define void @wombat(ptr %arg) {
+; CHECK-LABEL: define void @wombat(
+; CHECK-SAME: ptr [[ARG:%.*]]) {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[CALL:%.*]] = call ptr @malloc(i64 1)
+; CHECK-NEXT:    [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8
+; CHECK-NEXT:    [[LOAD1:%.*]] = load ptr, ptr [[LOAD]], align 8
+; CHECK-NEXT:    [[CALL2:%.*]] = call ptr [[LOAD1]](ptr [[CALL]])
+; CHECK-NEXT:    ret void
+;
+bb:
+  %call = call ptr @malloc(i64 1)
+  %load = load ptr, ptr %arg, align 8
+  %load1 = load ptr, ptr %load, align 8
+  %call2 = call ptr %load1(ptr %call)
+  ret void
+}
+
+attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }


        


More information about the llvm-commits mailing list