Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

codegen crash with inline asm #14765

Open
llvmbot opened this issue Nov 20, 2012 · 8 comments
Open

codegen crash with inline asm #14765

llvmbot opened this issue Nov 20, 2012 · 8 comments
Labels
backend:X86 bugzilla Issues migrated from bugzilla tools:llc

Comments

@llvmbot
Copy link
Collaborator

llvmbot commented Nov 20, 2012

Bugzilla Link 14393
Version trunk
OS Linux
Reporter LLVM Bugzilla Contributor
CC @topperc,@echristo,@efriedma-quic,@RKSimon,@rotateright

Extended Description

Reported by rajesh viswabramana on llvmdev, I just converted the test to IL:


target triple = "i386-unknown-linux-gnu"

define double @​func1() {
entry:
%0 = tail call double asm "", "=r,0,{dirflag},{fpsr},~{flags}"(double undef)
ret double %0
}

$ ./bin/llc test.ll
llc: /home/espindola/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:383: void getCopyToParts(llvm::SelectionDAG &, llvm::DebugLoc, llvm::SDValue, llvm::SDValue *, unsigned int, llvm::EVT, const llvm::Value *, ISD::NodeType): Assertion `(PartVT.isInteger() || PartVT == MVT::x86mmx) && ValueVT.isInteger() && "Unknown mismatch!"' failed.

@echristo
Copy link
Contributor

Well, it really shouldn't be done that way, but we shouldn't crash either.

@llvmbot
Copy link
Collaborator Author

llvmbot commented Nov 21, 2012

I found similar bug already reported, Closed

http://llvm.org/bugs/show_bug.cgi?id=8363

As per last comments in bug 8363,

Eric Christopher 2011-06-29 13:16:29 CDT
This appears to be fixed from the front end side of things.

But issue still present.

@efriedma-quic
Copy link
Collaborator

There isn't any possible way we can generate sane code for this; "r" means an integer register, and a 64-bit value can't fit into a 32-bit register. That said, both clang and the LLVM backend should be taught to generate a proper error message.

@llvmbot
Copy link
Collaborator Author

llvmbot commented Nov 22, 2012

I tried same code with gcc on arm with hard float,

double f2 ()
{
double x = 10.0;
asm ("" : "=r" (x) : "0" (x));
return x;
}

arm-linux-gnueabi-gcc -S -mhard-float pr39058.c -O2

Generates proper code,
mov r3, #​0
mov r2, #​0
movt r3, 16420
fmdrr d0, r2, r3
bx lr

@llvmbot
Copy link
Collaborator Author

llvmbot commented Nov 22, 2012

@ Eli Friedman
Could you please elobarate why generated code will be sane code if handled ?
Is gcc also shouldn't handle this case ?
Is there some specific reason for not handling this in llvm ?

@efriedma-quic
Copy link
Collaborator

See the discussion on llvmdev; gcc's behavior is weird, but consistent in a usable way for this particular case.

@llvmbot
Copy link
Collaborator Author

llvmbot commented May 7, 2013

Yet another testcase -target armv7-linux-gnueabihf:
void check_vect (void)
{
long long a = 0;
asm ("vorr %P0" :"=w" (a) : "0" (a));
}

@RKSimon
Copy link
Collaborator

RKSimon commented Dec 24, 2019

https://reviews.llvm.org/D35587 proposed a fix but hasn't been touched for years

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 3, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 bugzilla Issues migrated from bugzilla tools:llc
Projects
None yet
Development

No branches or pull requests

5 participants