gpt4 book ai didi

graph - LLVM DAG中的胶水和链依赖性是什么?

转载 作者:行者123 更新时间:2023-12-04 10:48:59 25 4
gpt4 key购买 nike

我对LLVM和编译器有些陌生。

我决定使用以下命令生成DAG

llc -view-sched-dags hello_world.ll

我有一个非常大的图,具有不同的依赖关系类型。 “LLVM核心库入门”一书解释说:

黑色箭头表示 数据流依赖性
红色箭头表示 胶依赖性
蓝色虚线箭头表示 链依赖性

我清楚地记得在学校的编译器类(class)中谈论过 数据流依赖性。但是我不记得谈论其他两个。有人可以解释其他依赖项的含义吗?任何帮助表示赞赏。

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

hello_world.sum.jpg
hello_world.sum.jpg

最佳答案

链相关性可防止具有副作用(包括内存操作和显式寄存器操作)的节点相对于彼此乱序进行调度。

胶水可防止在调度过程中将两个节点分开。它实际上比[1]更为微妙,但是大多数时候您不必担心。 (如果要实现自己的后端,要求两个指令彼此相邻,那么您真的想使用伪指令,并在调度发生后对其进行扩展。)

[1]:以http://lists.llvm.org/pipermail/llvm-dev/2014-June/074046.html为例

关于graph - LLVM DAG中的胶水和链依赖性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com