<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=Title content=""><meta name=Keywords content=""><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Courier New";
        panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body bgcolor=white lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi Min-Yih,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks for the help. I tried your patch but it didn’t work for my case. I think my problem is more related to output variable recognition.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Pei<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:12.0pt;color:black'>From: </span></b><span style='font-size:12.0pt;color:black'>Bekket McClane <bekket.mcclane@gmail.com><br><b>Date: </b>Tuesday, November 28, 2017 at 8:35 PM<br><b>To: </b>Pei Wang <uraj.wp@gmail.com><br><b>Cc: </b>llvm-dev <llvm-dev@lists.llvm.org><br><b>Subject: </b>Re: [llvm-dev] CodeExtractor buggy?<o:p></o:p></span></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal>Hi,<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I didn’t take a detail look on the problem you encountered, but early this October(5.0 is released in Sep I remembered), I fixed a bug related to exitStub in CodeExtractor:<o:p></o:p></p></div><div><p class=MsoNormal><a href="https://reviews.llvm.org/rL315041">https://reviews.llvm.org/rL315041</a><o:p></o:p></p></div><div><p class=MsoNormal>In short, I change the behavior of output variable restoring<o:p></o:p></p></div><div><p class=MsoNormal>Hope this helps<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Regards,<o:p></o:p></p></div><div><p class=MsoNormal>Min-Yih<o:p></o:p></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>Pei Wang via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> <span lang=ZH-CN style='font-family:"MS Mincho",serif'>於</span> 2017<span lang=ZH-CN style='font-family:"MS Mincho",serif'>年</span>11<span lang=ZH-CN style='font-family:"MS Mincho",serif'>月</span>29<span lang=ZH-CN style='font-family:"MS Mincho",serif'>日</span><span lang=ZH-CN> </span><span lang=ZH-CN style='font-family:"MS Mincho",serif'>上午</span>9:26 <span lang=ZH-CN style='font-family:"MS Mincho",serif'>寫道:</span><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal style='background:white'>Hi All,<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>I’m currently working on a simple task which needs to transform loops into tail-recursive functions. I found the CodeExtractor class a handy helper to use, but later encountered a problem.<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>Consider the following CU<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>struct S { int a, b; };</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>int foo(struct S *s, unsigned n) {</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  struct S *next = s;</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  unsigned i;</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  for (i = 0; i < n; ++i) {</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>    if (!s[i].a)</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>      break;</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>    next = s + i;</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  }</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  return next->b;</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>}</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>clang 5.0 gives the following IR with O1 optimizations<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>%struct.S = type { i32, i32 }</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; Function Attrs: norecurse nounwind readonly uwtable</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>define i32 @foo(%struct.S* nocapture readonly, i32) local_unnamed_addr #0 {</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %3 = icmp eq i32 %1, 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %3, label %16, label %4</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:4:                                      ; preds = %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br label %7</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:5:                                      ; preds = %7</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %6 = icmp ult i32 %15, %1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %6, label %7, label %16</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:7:                                      ; preds = %4, %5</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %8 = phi i32 [ %15, %5 ], [ 0, %4 ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %9 = phi %struct.S* [ %11, %5 ], [ %0, %4 ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %10 = zext i32 %8 to i64</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %11 = getelementptr inbounds %struct.S, %struct.S* %0, i64 %10</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %12 = getelementptr inbounds %struct.S, %struct.S* %11, i64 0, i32 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %13 = load i32, i32* %12, align 4, !tbaa !2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %14 = icmp eq i32 %13, 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %15 = add i32 %8, 1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %14, label %16, label %5</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:16:                                     ; preds = %5, %7, %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %17 = phi %struct.S* [ %0, %2 ], [ %9, %7 ], [ %11, %5 ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %18 = getelementptr inbounds %struct.S, %struct.S* %17, i64 0, i32 1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %19 = load i32, i32* %18, align 4, !tbaa !7</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  ret i32 %19</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>}</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>Here %17 should be noted, which is a phi with 3 incoming blocks, with two of them being part of the loop.<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>After using CodeExtractor to extract the loop into a new function, I got<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>%struct.S = type { i32, i32 }</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; Function Attrs: norecurse nounwind readonly uwtable</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>define i32 @foo(%struct.S* nocapture readonly, i32) local_unnamed_addr #0 {</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %.loc1 = alloca %struct.S*</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %.loc = alloca %struct.S*</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %3 = icmp eq i32 %1, 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %3, label %5, label %4</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:4:                                      ; preds = %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br label %codeRepl</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>codeRepl:                                         ; preds = %4</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  call void @foo_(%struct.S* %0, i32 %1, %struct.S** %.loc, %struct.S** %.loc1)</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %.reload = load %struct.S*, %struct.S** %.loc</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %.reload2 = load %struct.S*, %struct.S** %.loc1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br label %.loopexit</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>.loopexit:                                        ; preds = %codeRepl</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %.ph = phi %struct.S* [ %.reload2, %codeRepl ], [ %.reload, %codeRepl ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br label %5</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:5:                                      ; preds = %.loopexit, %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %6 = phi %struct.S* [ %0, %2 ], [ %.ph, %.loopexit ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %7 = getelementptr inbounds %struct.S, %struct.S* %6, i64 0, i32 1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %8 = load i32, i32* %7, align 4, !tbaa !2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  ret i32 %8</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>}</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; Function Attrs: nounwind uwtable</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>define internal void @foo_(%struct.S*, i32, %struct.S** %.out, %struct.S** %.out1) #1 {</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>newFuncRoot:</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br label %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>.loopexit.exitStub:                               ; preds = %11, %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  store %struct.S* %4, %struct.S** %.out</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  store %struct.S* %6, %struct.S** %.out1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  ret void</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:2:                                      ; preds = %newFuncRoot, %11</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %3 = phi i32 [ %10, %11 ], [ 0, %newFuncRoot ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %4 = phi %struct.S* [ %6, %11 ], [ %0, %newFuncRoot ]</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %5 = zext i32 %3 to i64</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %6 = getelementptr inbounds %struct.S, %struct.S* %0, i64 %5</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %7 = getelementptr inbounds %struct.S, %struct.S* %6, i64 0, i32 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %8 = load i32, i32* %7, align 4, !tbaa !7</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %9 = icmp eq i32 %8, 0</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %10 = add i32 %3, 1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %9, label %.loopexit.exitStub, label %11</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>; <label>:11:                                     ; preds = %2</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  %12 = icmp ult i32 %10, %1</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>  br i1 %12, label %2, label %.loopexit.exitStub</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div style='margin-left:.5in'><p class=MsoNormal style='background:white'><span style='font-family:"Courier New",serif'>}</span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>Now, because the loop is coalesced into a function, the definition of %.ph (derived from %17 in the previous version of IR) in .loopexit becomes funny: two different incoming values for the same incoming block. I was wondering if this is a bug of CodeExtractor or the extractor makes assumptions about the code to be extracted which I’m not aware of.<span class=apple-converted-space> </span><span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'> <span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>Thanks,<span style='font-size:12.0pt'><o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'>Pei Wang<span style='font-size:12.0pt'><o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica",sans-serif;background:white'>_______________________________________________</span><span style='font-size:9.0pt;font-family:"Helvetica",sans-serif'><br><span style='background:white'>LLVM Developers mailing list</span><br></span><a href="mailto:llvm-dev@lists.llvm.org"><span style='font-size:9.0pt;font-family:"Helvetica",sans-serif;color:#954F72;background:white'>llvm-dev@lists.llvm.org</span></a><span style='font-size:9.0pt;font-family:"Helvetica",sans-serif'><br></span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"><span style='font-size:9.0pt;font-family:"Helvetica",sans-serif;color:#954F72;background:white'>http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</span></a><o:p></o:p></p></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>