<div dir="ltr">Hi, <div><br></div><div>Look at the following code:</div><div><br></div><div><div style="font-size:12.8px">Look at the following C code  seqence:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div><font face="monospace, monospace">unsigned char mainGtU ( unsigned int i1,</font></div><div><font face="monospace, monospace">               unsigned int i2,</font></div><div><font face="monospace, monospace">               unsigned char* block)</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">   unsigned char c1, c2;</font></div><div><font face="monospace, monospace">   c1 = block[i1]; c2 = block[i2];<br></font></div><div><font face="monospace, monospace">   if (c1 != c2) return (c1 > c2);</font></div><div><font face="monospace, monospace">   i1++; i2++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">   c1 = block[i1]; c2 = block[i2];</font></div><div><font face="monospace, monospace">   if (c1 != c2) return (c1 > c2);</font></div><div><font face="monospace, monospace">   i1++; i2++;</font></div><div><br></div><div><font face="monospace, monospace">..</font></div></div><div style="font-size:12.8px">..</div><div style="font-size:12.8px"><repeat 12 times></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">In LLVM IR it will be following:</div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><div><font face="monospace, monospace">define i8 @mainGtU(i32 %i1, i32 %i2, i8* readonly %block, i16* nocapture readnone %quadrant, i32 %nblock, i32* nocapture readnone %budget) local_unnamed_addr #0 {</font></div><div><font face="monospace, monospace">entry:</font></div><div><font face="monospace, monospace">  %idxprom = zext i32 %i1 to i64</font></div><div><font face="monospace, monospace">  %arrayidx = getelementptr inbounds i8, i8* %block, i64 %idxprom</font></div><div><font face="monospace, monospace">  %0 = load i8, i8* %arrayidx, align 1</font></div><div><font face="monospace, monospace">  %idxprom1 = zext i32 %i2 to i64</font></div><div><font face="monospace, monospace">  %arrayidx2 = getelementptr inbounds i8, i8* %block, i64 %idxprom1</font></div><div><font face="monospace, monospace">  %1 = load i8, i8* %arrayidx2, align 1</font></div><div><font face="monospace, monospace">  %cmp = icmp eq i8 %0, %1</font></div><div><font face="monospace, monospace">  br i1 %cmp, label %if.end, label %if.then</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">if.then:                                          ; preds = %entry</font></div><div><font face="monospace, monospace">  %cmp7 = icmp ugt i8 %0, %1</font></div><div><font face="monospace, monospace">  br label %return</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">if.end:                                           ; preds = %entry</font></div><div><font face="monospace, monospace">  %inc = add i32 %i1, 1</font></div><div><font face="monospace, monospace">  %inc10 = add i32 %i2, 1</font></div><div><font face="monospace, monospace">  %idxprom11 = zext i32 %inc to i64</font></div><div><font face="monospace, monospace">  %arrayidx12 = getelementptr inbounds i8, i8* %block, i64 %idxprom11</font></div><div><font face="monospace, monospace">  %2 = load i8, i8* %arrayidx12, align 1</font></div><div><font face="monospace, monospace">  %idxprom13 = zext i32 %inc10 to i64</font></div><div><font face="monospace, monospace">  %arrayidx14 = getelementptr inbounds i8, i8* %block, i64 %idxprom13</font></div><div><font face="monospace, monospace">  %3 = load i8, i8* %arrayidx14, align 1</font></div><div><font face="monospace, monospace">  %cmp17 = icmp eq i8 %2, %3</font></div><div><font face="monospace, monospace">  br i1 %cmp17, label %if.end25, label %if.then19</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">if.then19:                                        ; preds = %if.end</font></div><div><font face="monospace, monospace">  %cmp22 = icmp ugt i8 %2, %3</font></div><div><font face="monospace, monospace">  br label %return</font></div><div><br></div></div><div style="font-size:12.8px">..</div><div style="font-size:12.8px">..</div><div style="font-size:12.8px"><repeats 12 times></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">This code sequence can be collapsed into call to  memcmp and we can get rid of basic blocks. I have written a small peephole optimization for squenece of instructions that identifies </div><div style="font-size:12.8px">branch termiantor, compare, load, gep etc and converts them to a call to memcmp. This small pass gave me improvement of 67% on SPEC2000 bzip2 on X86.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Is there a better idea, other than small peephole pass on IR to optimize this code?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Sirish</div><div style="font-size:12.8px"><span style="font-size:12.8px"> </span><br></div></div></div>