[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