changeset 26540:df230bb22ba6 stable

jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API * m4/acinclude.m4: New macro to check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 requires a type argument. * configure.ac: Call the new macro. * libinterp/parse-tree/pt-jit.cc: Add corresponding #if defined
author Julien Bect <jbect@users.sourceforge.net>
date Thu, 03 Jan 2019 21:54:54 +0100
parents ed1dad5e71c3
children 3e6d559c8756
files configure.ac libinterp/parse-tree/pt-jit.cc m4/acinclude.m4
diffstat 3 files changed, 38 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/configure.ac	Wed Jan 02 16:37:46 2019 +0100
+++ b/configure.ac	Thu Jan 03 21:54:54 2019 +0100
@@ -1446,6 +1446,8 @@
     OCTAVE_LLVM_LEGACY_PASSMANAGER_API
     OCTAVE_LLVM_IRBUILDER_API
     OCTAVE_LLVM_HAS_CREATEALWAYSINLINERPASS
+    OCTAVE_LLVM_IRBUILDER_CREATECONSTINBOUNDSGEP1_32_API
+
     AC_LANG_POP(C++)
     CPPFLAGS="$save_CPPFLAGS"
     LDFLAGS="$save_LDFLAGS"
--- a/libinterp/parse-tree/pt-jit.cc	Wed Jan 02 16:37:46 2019 +0100
+++ b/libinterp/parse-tree/pt-jit.cc	Thu Jan 03 21:54:54 2019 +0100
@@ -1373,11 +1373,13 @@
 
         for (size_t i = 0; i < m_argument_vec.size (); ++i)
           {
-            // LLVM <= 3.6
-            // llvm::Value *loaded_arg = builder.CreateConstInBoundsGEP1_32 (arg, i);
+#if defined (LLVM_IRBUILDER_CREATECONSTINBOUNDSGEP1_32_REQUIRES_TYPE)
             // LLVM >= 3.7
             llvm::Value *loaded_arg = builder.CreateConstInBoundsGEP1_32 (arg_type, arg, i);
-
+#else
+            // LLVM <= 3.6
+            llvm::Value *loaded_arg = builder.CreateConstInBoundsGEP1_32 (arg, i);
+#endif
             m_arguments[m_argument_vec[i].first] = loaded_arg;
           }
 
--- a/m4/acinclude.m4	Wed Jan 02 16:37:46 2019 +0100
+++ b/m4/acinclude.m4	Thu Jan 03 21:54:54 2019 +0100
@@ -2811,6 +2811,37 @@
   fi
 ])
 dnl
+dnl Check llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
+dbl
+AC_DEFUN([OCTAVE_LLVM_IRBUILDER_CREATECONSTINBOUNDSGEP1_32_API], [
+  AC_CACHE_CHECK([check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 requires a type argument],
+    [octave_cv_llvm_irbuilder_createconstinboundsgep1_32_requires_type],
+    [AC_LANG_PUSH(C++)
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[
+#if defined (HAVE_LLVM_IR_IRBUILDER_H)
+          #include <llvm/IR/IRBuilder.h>
+#elif defined (HAVE_LLVM_SUPPORT_IRBUILDER_H)
+          #include <llvm/Support/IRBuilder.h>
+#else
+          #include <llvm/IRBuilder.h>
+#endif
+          ]], [[
+          llvm::LLVMContext c;
+          llvm::IRBuilder<>  irb (c);
+          llvm::Value *v;
+          v = irb.CreateConstInBoundsGEP1_32 ((llvm::Value *) nullptr, 0);
+        ]])],
+        octave_cv_llvm_irbuilder_createconstinboundsgep1_32_requires_type=no,
+        octave_cv_llvm_irbuilder_createconstinboundsgep1_32_requires_type=yes)
+    AC_LANG_POP(C++)
+  ])
+  if test $octave_cv_llvm_irbuilder_createconstinboundsgep1_32_requires_type = yes; then
+    AC_DEFINE(LLVM_IRBUILDER_CREATECONSTINBOUNDSGEP1_32_REQUIRES_TYPE, 1,
+      [Define to 1 if llvm::IRBuilder::CreateConstInBoundsGEP1_32 requires a type argument.])
+  fi
+])
+dnl
 dnl OCTAVE_CHECK_FORTRAN_SYMBOL_AND_CALLING_CONVENTIONS
 dnl
 dnl Set variables related to Fortran symbol names (append underscore,