From 2e3d3903e624edd5bb32cdd9a9654c907d4f1744 Mon Sep 17 00:00:00 2001 From: Karthika Devi C Date: Tue, 31 Dec 2024 11:57:34 +0530 Subject: [PATCH] [polly] Skip instructions of different function in isHoistableLoad. (#118963) After patch 5ce47a5, some assert crashes occur in Polly. This issue arises because an instruction from one function queries the Dominator Tree (DT) of another function. To fix this, the `isHoistableLoad` function now skips instructions that belong to different function while iterating. --- polly/lib/Support/ScopHelper.cpp | 3 ++- polly/test/ScopDetect/dom-tree-crash.ll | 31 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 polly/test/ScopDetect/dom-tree-crash.ll diff --git a/polly/lib/Support/ScopHelper.cpp b/polly/lib/Support/ScopHelper.cpp index 6d50e297ef7154..d0e305a1bdcded 100644 --- a/polly/lib/Support/ScopHelper.cpp +++ b/polly/lib/Support/ScopHelper.cpp @@ -604,7 +604,8 @@ bool polly::isHoistableLoad(LoadInst *LInst, Region &R, LoopInfo &LI, for (auto *User : Ptr->users()) { auto *UserI = dyn_cast(User); - if (!UserI || !R.contains(UserI)) + if (!UserI || UserI->getFunction() != LInst->getFunction() || + !R.contains(UserI)) continue; if (!UserI->mayWriteToMemory()) continue; diff --git a/polly/test/ScopDetect/dom-tree-crash.ll b/polly/test/ScopDetect/dom-tree-crash.ll new file mode 100644 index 00000000000000..efc732c50e177e --- /dev/null +++ b/polly/test/ScopDetect/dom-tree-crash.ll @@ -0,0 +1,31 @@ +; RUN: opt %loadNPMPolly '-passes=print' -disable-output < %s 2>&1 | FileCheck %s + +; CHECK: Detected Scops in Function foo + +; This unit test case is to check if the following IR does not crash in isHoistableLoad function during Scop Detection. + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" +target triple = "aarch64-unknown-linux-gnueabi" + +define void @foo(ptr %block) { +entry: + br label %for.body + +for.cond1.preheader: ; preds = %for.body + %0 = load ptr, ptr null, align 8 + %1 = load i16, ptr %block, align 2 + %2 = load i16, ptr %0, align 2 + br label %foo.exit + +for.body: ; preds = %for.body, %entry + br i1 false, label %for.cond1.preheader, label %for.body + +foo.exit: ; preds = %for.cond1.preheader + ret void +} + +define void @init_foo() { +entry: + store ptr null, ptr null, align 8 + ret void +}