diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -1555,7 +1555,7 @@ // FIXME: For multi-BB cases, we need to see reachability from it to // store. // Bailout if Dest may have any ModRef before Store. - if (UI->comesBefore(Store) && isModOrRefSet(Res)) + if (DT->dominates(UI, Store) && isModOrRefSet(Res)) return false; DestModRef |= BAA.getModRefInfo(UI, DestLoc); diff --git a/llvm/test/Transforms/MemCpyOpt/cross-block.ll b/llvm/test/Transforms/MemCpyOpt/cross-block.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/MemCpyOpt/cross-block.ll @@ -0,0 +1,40 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -passes=early-cse,memcpyopt -verify-memoryssa | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + +%struct.nsRect = type { i32, i32, i32, i32 } + +define void @test_case(ptr %this, ptr %aFrame, i1 %call14) unnamed_addr { +; CHECK-LABEL: @test_case( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[R:%.*]] = alloca [[STRUCT_NSRECT:%.*]], align 8 +; CHECK-NEXT: [[REF_TMP18:%.*]] = alloca [[STRUCT_NSRECT]], align 8 +; CHECK-NEXT: store i32 0, ptr [[R]], align 4 +; CHECK-NEXT: br i1 [[CALL14:%.*]], label [[IF_THEN17:%.*]], label [[IF_END21:%.*]] +; CHECK: if.then17: +; CHECK-NEXT: call void @fwd_decl(ptr [[REF_TMP18]], ptr [[R]]) +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[R]], ptr [[REF_TMP18]], i64 16, i1 false) +; CHECK-NEXT: br label [[IF_END21]] +; CHECK: if.end21: +; CHECK-NEXT: ret void +; +entry: + %r = alloca %struct.nsRect + %ref.tmp18 = alloca %struct.nsRect + %x = getelementptr inbounds %struct.nsRect, ptr %r, i32 0, i32 0 + store i32 0, ptr %x + br i1 %call14, label %if.then17, label %if.end21 + +if.then17: + call void @fwd_decl(ptr %ref.tmp18, ptr %r) + call void @llvm.memcpy.p0.p0.i64(ptr %r, ptr %ref.tmp18, i64 16, i1 false) + br label %if.end21 + +if.end21: + ret void +} + +declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) + +declare hidden void @fwd_decl(ptr, ptr )