r313019 - [MS-InlineAsm] Fix cast assertion with vector spills (PR34021)

Simon Pilgrim via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 12 04:05:42 PDT 2017


Author: rksimon
Date: Tue Sep 12 04:05:42 2017
New Revision: 313019

URL: http://llvm.org/viewvc/llvm-project?rev=313019&view=rev
Log:
[MS-InlineAsm] Fix cast assertion with vector spills (PR34021)

Differential Revision: https://reviews.llvm.org/D37448

Added:
    cfe/trunk/test/CodeGen/pr34021.c
Modified:
    cfe/trunk/lib/CodeGen/CGStmt.cpp

Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=313019&r1=313018&r2=313019&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue Sep 12 04:05:42 2017
@@ -2194,7 +2194,7 @@ void CodeGenFunction::EmitAsmStmt(const
                    llvm::IntegerType::get(getLLVMContext(), (unsigned)TmpSize));
         Tmp = Builder.CreateTrunc(Tmp, TruncTy);
       } else if (TruncTy->isIntegerTy()) {
-        Tmp = Builder.CreateTrunc(Tmp, TruncTy);
+        Tmp = Builder.CreateZExtOrTrunc(Tmp, TruncTy);
       } else if (TruncTy->isVectorTy()) {
         Tmp = Builder.CreateBitCast(Tmp, TruncTy);
       }

Added: cfe/trunk/test/CodeGen/pr34021.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/pr34021.c?rev=313019&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/pr34021.c (added)
+++ cfe/trunk/test/CodeGen/pr34021.c Tue Sep 12 04:05:42 2017
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -fms-extensions %s -triple=i686-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefix=X86
+// RUN: %clang_cc1 -fms-extensions %s -triple=x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefix=X64
+
+typedef int v4si __attribute__ ((vector_size (16)));
+v4si rep() {
+// X86-LABEL: define <4 x i32> @rep
+// X86:      %retval = alloca <4 x i32>, align 16
+// X86-NEXT: %res = alloca <4 x i32>, align 16
+// X86-NEXT: %0 = bitcast <4 x i32>* %retval to i128*
+// X86-NEXT: %1 = call i64 asm sideeffect inteldialect "", "=A,~{dirflag},~{fpsr},~{flags}"()
+// X86-NEXT: %2 = zext i64 %1 to i128
+// X86-NEXT: store i128 %2, i128* %0, align 16
+// X86-NEXT: %3 = load <4 x i32>, <4 x i32>* %res, align 16
+// X86-NEXT: ret <4 x i32> %3
+//
+// X64-LABEL: define <4 x i32> @rep
+// X64:      %res = alloca <4 x i32>, align 16
+// X64-NEXT: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
+// X64-NEXT: %0 = load <4 x i32>, <4 x i32>* %res, align 16
+// X64-NEXT: ret <4 x i32> %0
+  v4si res;
+  __asm {}
+  return res;
+}




More information about the cfe-commits mailing list