diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index c7b1dc9517527..47088aa23a4e7 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -2693,8 +2693,9 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J, // Preserve !invariant.group in K. break; case LLVMContext::MD_align: - K->setMetadata(Kind, - MDNode::getMostGenericAlignmentOrDereferenceable(JMD, KMD)); + if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef)) + K->setMetadata( + Kind, MDNode::getMostGenericAlignmentOrDereferenceable(JMD, KMD)); break; case LLVMContext::MD_dereferenceable: case LLVMContext::MD_dereferenceable_or_null: diff --git a/llvm/test/Transforms/InstCombine/load-combine-metadata-dominance.ll b/llvm/test/Transforms/InstCombine/load-combine-metadata-dominance.ll index 5f86c16b17a77..07a15d01cf43c 100644 --- a/llvm/test/Transforms/InstCombine/load-combine-metadata-dominance.ll +++ b/llvm/test/Transforms/InstCombine/load-combine-metadata-dominance.ll @@ -1,4 +1,4 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2 ; RUN: opt -passes=instcombine -S < %s | FileCheck %s target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" @@ -96,5 +96,57 @@ bb1: store i32 0, ptr %b ret void } + +define void @combine_metadata_dominance5(ptr %p) { +; CHECK-LABEL: define void @combine_metadata_dominance5 +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BB1:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !1 +; CHECK-NEXT: store i32 0, ptr [[A]], align 4 +; CHECK-NEXT: ret void +; +entry: + %a = load ptr, ptr %p, !align !2 + br label %bb1 + +bb1: + %b = load ptr, ptr %p, !align !3 + store i32 0, ptr %a + store i32 0, ptr %b + ret void +} + +define void @combine_metadata_dominance6(ptr %p) { +; CHECK-LABEL: define void @combine_metadata_dominance6 +; CHECK-SAME: (ptr [[P:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BB1:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !2, !noundef !0 +; CHECK-NEXT: store i32 0, ptr [[A]], align 8 +; CHECK-NEXT: ret void +; +entry: + %a = load ptr, ptr %p, !align !2, !noundef !1 + br label %bb1 + +bb1: + %b = load ptr, ptr %p, !align !3 + store i32 0, ptr %a + store i32 0, ptr %b + ret void +} + !0 = !{} !1 = !{} +!2 = !{i64 8} +!3 = !{i64 4} +;. +; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(read) } +;. +; CHECK: [[META0:![0-9]+]] = !{} +; CHECK: [[META1:![0-9]+]] = !{i64 4} +; CHECK: [[META2:![0-9]+]] = !{i64 8} +;.