[polly] 9820dd9 - [Polly] Support for InlineAsm.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 26 01:32:18 PDT 2021
Author: Michael Kruse
Date: 2021-09-26T03:26:43-05:00
New Revision: 9820dd970c1b72c7f77fad647b762053e2f60e31
URL: https://github.com/llvm/llvm-project/commit/9820dd970c1b72c7f77fad647b762053e2f60e31
DIFF: https://github.com/llvm/llvm-project/commit/9820dd970c1b72c7f77fad647b762053e2f60e31.diff
LOG: [Polly] Support for InlineAsm.
Inline assembly was not handled at all and treated like a llvm::Value.
In particular, it tried to create a pointer it which is not allowed.
Fix by handling like a llvm::Constant such that it is just reused when
required, instead of trying to marshall it in memory.
Fixes llvm.org/PR51960
Added:
polly/test/CodeGen/OpenMP/inlineasm.ll
Modified:
polly/lib/Support/VirtualInstruction.cpp
Removed:
################################################################################
diff --git a/polly/lib/Support/VirtualInstruction.cpp b/polly/lib/Support/VirtualInstruction.cpp
index be055acc4fa2..07f8ff54324b 100644
--- a/polly/lib/Support/VirtualInstruction.cpp
+++ b/polly/lib/Support/VirtualInstruction.cpp
@@ -56,7 +56,8 @@ VirtualUse VirtualUse::create(Scop *S, ScopStmt *UserStmt, Loop *UserScope,
if (isa<BasicBlock>(Val))
return VirtualUse(UserStmt, Val, Block, nullptr, nullptr);
- if (isa<llvm::Constant>(Val) || isa<MetadataAsValue>(Val))
+ if (isa<llvm::Constant>(Val) || isa<MetadataAsValue>(Val) ||
+ isa<InlineAsm>(Val))
return VirtualUse(UserStmt, Val, Constant, nullptr, nullptr);
// Is the value synthesizable? If the user has been pruned
diff --git a/polly/test/CodeGen/OpenMP/inlineasm.ll b/polly/test/CodeGen/OpenMP/inlineasm.ll
new file mode 100644
index 000000000000..2e936307c556
--- /dev/null
+++ b/polly/test/CodeGen/OpenMP/inlineasm.ll
@@ -0,0 +1,37 @@
+; RUN: opt %loadPolly -polly-opt-isl -polly-parallel -polly-codegen -S < %s | FileCheck %s
+; llvm.org/PR51960
+
+; CHECK-LABEL: define internal void @foo_polly_subfn
+; CHECK: polly.stmt.for.body3:
+; CHECK: tail call i32 asm "664:\0A", "={ax},{di},~{dirflag},~{fpsr},~{flags}"(i32 0)
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define i32 @foo([1 x i32]* %bar) {
+for.cond1.preheader.preheader:
+ br label %for.cond1.preheader
+
+for.cond1.preheader:
+ %indvars.iv16 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next17, %for.inc6 ]
+ br label %for.body3
+
+for.body3:
+ %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 0, %for.cond1.preheader ]
+ %xyzzy = tail call i32 asm "664:\0A", "={ax},{di},~{dirflag},~{fpsr},~{flags}"(i32 0) #0
+ %arrayidx5 = getelementptr inbounds [1 x i32], [1 x i32]* %bar, i64 0, i64 %indvars.iv
+ store i32 %xyzzy, i32* %arrayidx5, align 4
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+ %exitcond.not = icmp eq i64 %indvars.iv, 1
+ br i1 %exitcond.not, label %for.inc6, label %for.body3
+
+for.inc6:
+ %indvars.iv.next17 = add nuw nsw i64 %indvars.iv16, 1
+ %exitcond19.not = icmp eq i64 %indvars.iv16, 1
+ br i1 %exitcond19.not, label %for.end8, label %for.cond1.preheader
+
+for.end8:
+ ret i32 0
+}
+
+attributes #0 = { readnone }
More information about the llvm-commits
mailing list