From c5f9051b0c68c9c0453cc0045107bf1175fe4d99 Mon Sep 17 00:00:00 2001 From: Fiona Glaser Date: Thu, 11 Jan 2018 21:28:57 +0000 Subject: [PATCH] [Sink] Really really fix predicate in legality check LoadInst isn't enough; we need to include intrinsics that perform loads too. All side-effecting intrinsics and such are already covered by the isSafe check, so we just need to care about things that read from memory. D41960, originally from D33179. llvm-svn: 322311 --- lib/Transforms/Scalar/Sink.cpp | 2 +- test/Transforms/Sink/badloadsink.ll | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/Sink.cpp b/lib/Transforms/Scalar/Sink.cpp index cfb8a062299..81176288049 100644 --- a/lib/Transforms/Scalar/Sink.cpp +++ b/lib/Transforms/Scalar/Sink.cpp @@ -114,7 +114,7 @@ static bool IsAcceptableTarget(Instruction *Inst, BasicBlock *SuccToSinkTo, if (SuccToSinkTo->getUniquePredecessor() != Inst->getParent()) { // We cannot sink a load across a critical edge - there may be stores in // other code paths. - if (isa(Inst)) + if (Inst->mayReadFromMemory()) return false; // We don't want to sink across a critical edge if we don't dominate the diff --git a/test/Transforms/Sink/badloadsink.ll b/test/Transforms/Sink/badloadsink.ll index e3f4884c5a4..eb2b0fae482 100644 --- a/test/Transforms/Sink/badloadsink.ll +++ b/test/Transforms/Sink/badloadsink.ll @@ -1,18 +1,26 @@ ; RUN: opt < %s -basicaa -sink -S | FileCheck %s declare void @foo(i64 *) -define i64 @sinkload(i1 %cmp) { +declare i8* @llvm.load.relative.i32(i8* %ptr, i32 %offset) argmemonly nounwind readonly +define i64 @sinkload(i1 %cmp, i8* %ptr, i32 %off) { ; CHECK-LABEL: @sinkload top: %a = alloca i64 ; CHECK: call void @foo(i64* %a) ; CHECK-NEXT: %x = load i64, i64* %a +; CHECK-NEXT: %y = call i8* @llvm.load.relative.i32(i8* %ptr, i32 %off) call void @foo(i64* %a) %x = load i64, i64* %a + %y = call i8* @llvm.load.relative.i32(i8* %ptr, i32 %off) br i1 %cmp, label %A, label %B A: store i64 0, i64 *%a + store i8 0, i8 *%ptr br label %B B: ; CHECK-NOT: load i64, i64 *%a - ret i64 %x +; CHECK-NOT: call i8* @llvm.load.relative(i8* %ptr, i32 off) + %y2 = ptrtoint i8* %y to i64 + %retval = add i64 %y2, %x + ret i64 %retval } +