2015-10-08 7 views
6

मैं एलएलवीएम और कंपाइलर्स के लिए कुछ नया हूं।एलएलवीएम डीएजी में गोंद और श्रृंखला निर्भरता क्या हैं?

मैं निम्न आदेश

llc -view-sched-dags hello_world.ll 

मैं अलग निर्भरता प्रकार के साथ एक बहुत बड़ा ग्राफ मिला का उपयोग कर एक DAG उत्पन्न करने के लिए तय कर लिया है। "LLVM कोर पुस्तकालय के साथ प्रारंभ करना" पुस्तक में विस्तार से बताया है कि:

काले ऐरो का अर्थ है डाटा प्रवाह निर्भरता
लाल ऐरो का अर्थ है गोंद निर्भरता
ब्लू धराशायी ऐरो का अर्थ है श्रृंखला निर्भरता

मैं स्पष्ट रूप से याद विद्यालय में मेरे कंपाइलर कक्षा में डेटा प्रवाह निर्भरता के बारे में बात करना। लेकिन मुझे दूसरे दो के बारे में बात याद नहीं है। क्या कोई अन्य निर्भरताओं के अर्थ की व्याख्या कर सकता है? किसी भी मदद की सराहना की है।

hello_world.cpp

#include <stdio.h> 
#include <assert.h> 

int sum(int a, int b) { 
    return a + b; 
} 

int main(int argc, char** argv) { 
    printf("Hello World! %d\n", sum(argc, 1)); 
    return 0; 
} 

hello_world.ll

; ModuleID = 'hello_world.cpp' 
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-unknown-linux-gnu" 

@.str = private unnamed_addr constant [17 x i8] c"Hello World! %d\0A\00", align 1 

; Function Attrs: nounwind uwtable 
define i32 @_Z3sumii(i32 %a, i32 %b) #0 { 
entry: 
    %a.addr = alloca i32, align 4 
    %b.addr = alloca i32, align 4 
    store i32 %a, i32* %a.addr, align 4 
    store i32 %b, i32* %b.addr, align 4 
    %0 = load i32* %a.addr, align 4 
    %1 = load i32* %b.addr, align 4 
    %add = add nsw i32 %0, %1 
    ret i32 %add 
} 

; Function Attrs: uwtable 
define i32 @main(i32 %argc, i8** %argv) #1 { 
entry: 
    %retval = alloca i32, align 4 
    %argc.addr = alloca i32, align 4 
    %argv.addr = alloca i8**, align 8 
    store i32 0, i32* %retval 
    store i32 %argc, i32* %argc.addr, align 4 
    store i8** %argv, i8*** %argv.addr, align 8 
    %0 = load i32* %argc.addr, align 4 
    %call = call i32 @_Z3sumii(i32 %0, i32 1) 
    %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([17 x i8]* @.str, i32 0, i32 0), i32 %call) 
    ret i32 0 
} 

declare i32 @printf(i8*, ...) #2 

attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 
attributes #1 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 
attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 

!llvm.ident = !{!0} 

!0 = metadata !{metadata !"clang version 3.5.0 "} 

hello_world.main.jpg hello_world.main.jpg

HEL lo_world.sum.jpg hello_world.sum.jpg

उत्तर

7

चेन निर्भरता एक दूसरे के आदेश रिश्तेदार से बाहर अनुसूचित किया जा रहा से होने वाले दुष्प्रभाव (स्मृति संचालन और स्पष्ट रजिस्टर संचालन सहित) के साथ नोड्स को रोकने के।

गोंद शेड्यूलिंग के दौरान दो नोड्स को तोड़ने से रोकता है। यह वास्तव में [1] से अधिक सूक्ष्म है, लेकिन अधिकांश समय आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। (यदि आप अपने स्वयं के बैकएंड को कार्यान्वित कर रहे हैं जिसके लिए एक दूसरे के समीप होने के लिए दो निर्देशों की आवश्यकता है, तो आप वास्तव में एक छद्म निर्देश का उपयोग करना चाहते हैं, और शेड्यूलिंग के बाद इसका विस्तार करना चाहते हैं।)

[1]: उदाहरण के लिए http://lists.llvm.org/pipermail/llvm-dev/2014-June/074046.html देखें

संबंधित मुद्दे