diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2011-07-29 00:24:50 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-07-29 00:24:50 +0000 |
commit | 93f1322684e928a559286ba1c7cb83af077aa658 (patch) | |
tree | b4fa0cc965438ebfb319f8207edae00f30b39f74 | |
parent | 9aab1489866a5afe1a8a3267f9ad7124034fd644 (diff) |
Fix assertion failure in CodeGen where the input operand to an asm
instruction is tied to an output operand which is a pointer, and
the input operand is narrower than the output operand.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136438 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 6 | ||||
-rw-r--r-- | test/CodeGen/asm.c | 9 |
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 60db07d388..9987fd900b 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -1533,8 +1533,12 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { llvm::Type *OutputTy = ConvertType(OutputType); if (isa<llvm::IntegerType>(OutputTy)) Arg = Builder.CreateZExt(Arg, OutputTy); - else + else if (isa<llvm::PointerType>(OutputTy)) + Arg = Builder.CreateZExt(Arg, IntPtrTy); + else { + assert(OutputTy->isFloatingPointTy() && "Unexpected output type"); Arg = Builder.CreateFPExt(Arg, OutputTy); + } } } if (llvm::Type* AdjTy = diff --git a/test/CodeGen/asm.c b/test/CodeGen/asm.c index a2d56c84f4..019eb9ca3e 100644 --- a/test/CodeGen/asm.c +++ b/test/CodeGen/asm.c @@ -200,6 +200,15 @@ unsigned char t23(unsigned char a, unsigned char b) { return res; } +void *t24(char c) { + void *addr; + // CHECK: @t24 + // CHECK: zext i8 {{.*}} to i32 + // CHECK-NEXT: call i8* asm "foobar" + __asm__ ("foobar" : "=a" (addr) : "0" (c)); + return addr; +} + // PR10299 - fpsr, fpcr void test(void) |