From 93f1322684e928a559286ba1c7cb83af077aa658 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 29 Jul 2011 00:24:50 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGStmt.cpp | 6 +++++- test/CodeGen/asm.c | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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(OutputTy)) Arg = Builder.CreateZExt(Arg, OutputTy); - else + else if (isa(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) -- 2.40.0