簡體   English   中英

了解llvm-ir進行x86_64-unknown-linux-gnu的匯編

[英]Understanding llvm-ir to assembly for x86_64-unknown-linux-gnu

我轉換以下llvm-IR

; Function Attrs: noinline norecurse nounwind uwtable
define i32 @main() #0{
entry:
%sub = sub nsw i32 5, 3
%cmp = icmp slt i32 %sub, 3
br i1 %cmp, label %if.then, label %if.else

if.then:                                          ; preds = %entry
%mul = mul nsw i32 %sub, 2
br label %if.end

if.else:                                          ; preds = %entry
%sub1 = sub nsw i32 %sub, 3
br label %if.end

if.end:                                           ; preds = %if.else, 
%if.then
%y.0 = phi i32 [ %mul, %if.then ], [ %sub1, %if.else ]
%sub2 = sub nsw i32 %sub, %y.0
%add = add nsw i32 %sub, %y.0
ret i32 0
}

使用llc sample.ll生成x86_64-unknown-linux-gnu匯編代碼,生成匯編代碼:

    .text
    .file   "phi.cpp"
    .globl  main                    # -- Begin function main
    .p2align        4, 0x90
    .type   main,@function
main:                                   # @main
    .cfi_startproc
# BB#0:                                 # %entry
    pushq   %rbp
.Lcfi0:
    .cfi_def_cfa_offset 16
.Lcfi1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
.Lcfi2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    testb   %al, %al
    xorl    %eax, %eax
    popq    %rbp
    retq
.Lfunc_end0:
    .size   main, .Lfunc_end0-main
    .cfi_endproc
                                    # -- End function

上面代碼中的寄存器: %rbp是基指針,它指向當前堆棧幀的底部, %rsp是堆棧指針,它指向當前堆棧幀的頂部,並且操作數存儲在%eax%al用於算術運算,但是在%eax%al寄存器中找不到要加載值的指令,我也想知道

  1. LLC如何在程序集級別處理phi節點

lli默認值為-O2 ,您的代碼以一個常量表達式sub nsw i32 5, 3 因此,您的函數基本上什么也沒有做,並且LLVM唯一應保留的是使EAX無效。

如果您運行lli -O0 your.ll ,則會得到很多冗長的代碼,這些代碼會在堆棧上溢出並注冊負載。

順便說一句,有一對稱為mem2regreg2mem的傳遞,可以將代碼從SSA格式來回轉換。 具體來說,這些過程會將phi節點轉換為分支,並在IR中引入顯式存儲和負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM