Skip to content

Commit 9820dd9

Browse files
committed
[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
1 parent d5c8716 commit 9820dd9

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

polly/lib/Support/VirtualInstruction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ VirtualUse VirtualUse::create(Scop *S, ScopStmt *UserStmt, Loop *UserScope,
5656
if (isa<BasicBlock>(Val))
5757
return VirtualUse(UserStmt, Val, Block, nullptr, nullptr);
5858

59-
if (isa<llvm::Constant>(Val) || isa<MetadataAsValue>(Val))
59+
if (isa<llvm::Constant>(Val) || isa<MetadataAsValue>(Val) ||
60+
isa<InlineAsm>(Val))
6061
return VirtualUse(UserStmt, Val, Constant, nullptr, nullptr);
6162

6263
// Is the value synthesizable? If the user has been pruned
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
; RUN: opt %loadPolly -polly-opt-isl -polly-parallel -polly-codegen -S < %s | FileCheck %s
2+
; llvm.org/PR51960
3+
4+
; CHECK-LABEL: define internal void @foo_polly_subfn
5+
; CHECK: polly.stmt.for.body3:
6+
; CHECK: tail call i32 asm "664:\0A", "={ax},{di},~{dirflag},~{fpsr},~{flags}"(i32 0)
7+
8+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
9+
target triple = "x86_64-unknown-linux-gnu"
10+
11+
define i32 @foo([1 x i32]* %bar) {
12+
for.cond1.preheader.preheader:
13+
br label %for.cond1.preheader
14+
15+
for.cond1.preheader:
16+
%indvars.iv16 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next17, %for.inc6 ]
17+
br label %for.body3
18+
19+
for.body3:
20+
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 0, %for.cond1.preheader ]
21+
%xyzzy = tail call i32 asm "664:\0A", "={ax},{di},~{dirflag},~{fpsr},~{flags}"(i32 0) #0
22+
%arrayidx5 = getelementptr inbounds [1 x i32], [1 x i32]* %bar, i64 0, i64 %indvars.iv
23+
store i32 %xyzzy, i32* %arrayidx5, align 4
24+
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
25+
%exitcond.not = icmp eq i64 %indvars.iv, 1
26+
br i1 %exitcond.not, label %for.inc6, label %for.body3
27+
28+
for.inc6:
29+
%indvars.iv.next17 = add nuw nsw i64 %indvars.iv16, 1
30+
%exitcond19.not = icmp eq i64 %indvars.iv16, 1
31+
br i1 %exitcond19.not, label %for.end8, label %for.cond1.preheader
32+
33+
for.end8:
34+
ret i32 0
35+
}
36+
37+
attributes #0 = { readnone }

0 commit comments

Comments
 (0)