From: Tom Stellard <thomas.stell...@amd.com>

We need to do this until function calls are supported.

v2:
  - Fix loop conditional

https://bugs.freedesktop.org/show_bug.cgi?id=64225

CC: "10.0" <mesa-sta...@lists.freedesktop.org>
---
 src/gallium/drivers/radeon/radeon_llvm_util.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_llvm_util.c 
b/src/gallium/drivers/radeon/radeon_llvm_util.c
index f2b3e13..3ba0acc 100644
--- a/src/gallium/drivers/radeon/radeon_llvm_util.c
+++ b/src/gallium/drivers/radeon/radeon_llvm_util.c
@@ -30,6 +30,7 @@
 #include <llvm-c/BitReader.h>
 #include <llvm-c/Core.h>
 #include <llvm-c/Target.h>
+#include <llvm-c/Transforms/IPO.h>
 #include <llvm-c/Transforms/PassManagerBuilder.h>
 
 LLVMModuleRef radeon_llvm_parse_bitcode(const unsigned char * bitcode,
@@ -59,9 +60,26 @@ static void radeon_llvm_optimize(LLVMModuleRef mod)
        LLVMTargetDataRef TD = LLVMCreateTargetData(data_layout);
        LLVMPassManagerBuilderRef builder = LLVMPassManagerBuilderCreate();
        LLVMPassManagerRef pass_manager = LLVMCreatePassManager();
-       LLVMAddTargetData(TD, pass_manager);
 
-       LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 1000000000);
+       /* Functions calls are not supported yet, so we need to inline
+        * everything.  The most efficient way to do this is to add
+        * the always_inline attribute to all non-kernel functions
+        * and then run the Always Inline pass.  The Always Inline
+        * pass will automaically inline functions with this attribute
+        * and does not perform the expensive cost analysis that the normal
+        * inliner does.
+        */
+
+       LLVMValueRef fn;
+       for (fn = LLVMGetFirstFunction(mod); fn; fn = LLVMGetNextFunction(fn)) {
+               /* All the non-kernel functions have internal linkage */
+               if (LLVMGetLinkage(fn) == LLVMInternalLinkage) {
+                       LLVMAddFunctionAttr(fn, LLVMAlwaysInlineAttribute);
+               }
+       }
+
+       LLVMAddTargetData(TD, pass_manager);
+       LLVMAddAlwaysInlinerPass(pass_manager);
        LLVMPassManagerBuilderPopulateModulePassManager(builder, pass_manager);
 
        LLVMRunPassManager(pass_manager, mod);
-- 
1.8.1.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to