[llvm-dev] Weird miscompilation? Please help, i'm lost.

Roman Lebedev via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 10 14:57:18 PDT 2017


Hi.

I have accidentally wrote some code that results in rather strange symptoms.
I do not have a reduced testcase. I do not know how to reduce more than one 
sourcefile in an automatic way.
*Please* bear with me, i'll try to write all the details i know.

The program is compiled with *NO* optimizations whatsoever, without any 
threading, with clang version 6.0.0-svn310042-1~exp1;
however i observe the same with 3.9/4.0/5.0, and at least with -O1.

0. The main symptom is:
The following assertion fails:
https://github.com/LebedevRI/rawspeed/blob/
4901a4b3b979440be22c052b5dab962b84491b01/src/librawspeed/decompressors/
PentaxDecompressor.cpp#L212
How can it possibly fail, given all that code, no threading, and the fact that 
they are integers?
1. Undefined Behaviour sanitizer (including interger sanitizer) do not say 
anything about that code.
2. Address Sanitizer is silent too.
3. Memory Sanitizer is also silent (!)
4. This is probably *not* un-initialized read because the results are 
deterministic and stable regardless of MALLOC_PERTURB_ and asan's 
malloc_fill_byte)

Reproduction:
0. $ git clone https://github.com/LebedevRI/rawspeed.git
1. $ cd rawspeed
2. $ git checkout origin/llvm-broken
3. $ mkdir build && cd build
4. build it, with one single external dep - googletest:
$ CC=clang-6.0 CXX=clang++-6.0 cmake -DCMAKE_BUILD_TYPE=Debug -
DWITH_OPENMP=OFF -DWITH_PTHREADS=OFF -DWITH_PUGIXML=OFF -DWITH_JPEG=OFF -
DWITH_ZLIB=OFF -DUSE_XMLLINT=OFF -DBUILD_TESTING=ON -
DALLOW_DOWNLOADING_GOOGLEBENCHMARK=ON ../
5. $ make
6. get the file that uses that codepath (given raw sample is under CC0)
$ wget https://raw.pixls.us/getfile.php/867/raw/PK1_0762.PEF
7. $ touch PK1_0762.PEF.hash
8. actually hopefully reproduce:
$ src/utilities/rstest/rstest PK1_0762.PEF

This has to be either miscompilation/bug, or missing feature in UBSan, right?

I'm so sorry, i do not have a minimized testcase :(
I'm lost. Not sure how else i can help with this. Please do tell.
But now, here is some (a lot of) gdb output.

$ gdb src/utilities/rstest/rstest
(gdb) r PK1_0762.PEF
Starting program: /home/lebedevri/rawspeed/build/src/utilities/rstest/rstest 
PK1_0762.PEF
PK1_0762.PEF: starting decoding ... 
rstest: /home/lebedevri/rawspeed/src/librawspeed/decompressors/
PentaxDecompressor.cpp:212: void 
rawspeed::PentaxDecompressor::decompressInternal(int, int) const [TM = 
rawspeed::PentaxDecompressor::ThreadingModel::SlaveThread]: Assertion `dest[x] 
== pred[0]' failed.

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig at entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

^ the main symptom is that assertion failure.

This is not threading issue:
(gdb) thread
[Current thread is 1 (process 20673)]
(gdb) info threads
  Id   Target Id         Frame 
* 1    process 20673 "rstest" __GI_raise (sig=sig at entry=6) at ../sysdeps/unix/
sysv/linux/raise.c:51

(gdb) f 4
#4  0x000000000056976f in 
rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2> 
(this=0x7fffffffcf30, row_start=0, row_end=4950) at /home/lebedevri/rawspeed/
src/librawspeed/decompressors/PentaxDecompressor.cpp:212
212             assert(dest[x] == pred[0]);
(gdb) bt full
...
#4  0x000000000056976f in 
rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2> 
(this=0x7fffffffcf30, row_start=0, row_end=4950) at /home/lebedevri/rawspeed/
src/librawspeed/decompressors/PentaxDecompressor.cpp:212
        diff = {65535, 0}
        x = 2
        dest = 0x7fffefacd010
        pred = {65662, 126}
        y = 0
        bs = {<rawspeed::ByteStream> = {<rawspeed::DataBuffer> = 
{<rawspeed::Buffer> = {data = 0x0, size = 0, isOwner = false}, endianness = 
rawspeed::Endianness::little}, pos = 0}, cache = 
{<rawspeed::BitStreamCacheBase> = {cache = 0, fillLevel = 0, static Size = 64, 
              static MaxGetBits = 32, static MaxProcessBytes = 8}, <No data 
fields>}}
        draw = 0x7fffefacd010 "\177"
        pUp = {{0, 0}, {0, 0}}
...
(gdb) f 4
(gdb) p pred[0]
$1 = 65662
(gdb) p dest[x]
$2 = 126
^ so at least the assert did not lie.

Now, let's look at the disassembly. I have a slight hope someone might spot 
something strange here? This is long, i'm pasting it all as-is.

(gdb) disassemble /m
Dump of assembler code for function 
rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const:
137     void PentaxDecompressor::decompressInternal(int row_start, int 
row_end) const {
   0x00000000005693b0 <+0>:     push   %rbp
   0x00000000005693b1 <+1>:     mov    %rsp,%rbp
   0x00000000005693b4 <+4>:     sub    $0x100,%rsp
   0x00000000005693bb <+11>:    mov    %rdi,-0x8(%rbp)
   0x00000000005693bf <+15>:    mov    %esi,-0xc(%rbp)
   0x00000000005693c2 <+18>:    mov    %edx,-0x10(%rbp)
   0x00000000005693c5 <+21>:    mov    -0x8(%rbp),%rdi
   0x00000000005693c9 <+25>:    lea    -0x38(%rbp),%rax

138       //#ifndef HAVE_PTHREAD
139       //  static_assert(TM == ThreadingModel::NoThreading, "if there are 
no
140       //  pthreads, "
141       //                                                   "then serial 
optimized "
142       //                                                   "codepath 
should be
143       //                                                   called");
144       //#endif
145
146       //  assert(!((disableThreading || getThreadCount() <= 1) ^
147       //           (TM == ThreadingModel::NoThreading)) &&
148       //         "either there is just one thread, and serial optimized 
codepath is
149       //         " "called; or there is more than one thread, and paralell 
optimized
150       //         " "codepaths are called");
151
152       BitPumpMSB bs;
   0x00000000005693cd <+29>:    mov    %rdi,-0x90(%rbp)
   0x00000000005693d4 <+36>:    mov    %rax,%rdi
   0x00000000005693d7 <+39>:    callq  0x569910 
<rawspeed::BitStream<rawspeed::MSBBitPumpTag, 
rawspeed::BitStreamCacheRightInLeftOut>::BitStream()>

153
154       if (TM != ThreadingModel::SlaveThread) {
155         assert(row_start == 0);
156         assert(row_end > row_start);
157         assert(mRaw->dim.y == row_end);
158
159         bs = BitPumpMSB(input);
160       }
161
162       uchar8* draw = mRaw->getData();
   0x00000000005693dc <+44>:    mov    -0x90(%rbp),%rax
   0x00000000005693e3 <+51>:    add    $0x8,%rax
   0x00000000005693e7 <+55>:    mov    %rax,%rdi
   0x00000000005693ea <+58>:    callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x00000000005693ef <+63>:    mov    %rax,-0x98(%rbp)
   0x00000000005693f6 <+70>:    jmpq   0x5693fb 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+75>
   0x00000000005693fb <+75>:    mov    -0x98(%rbp),%rdi
   0x0000000000569402 <+82>:    callq  0x4d4ad0 
<rawspeed::RawImageData::getData() const>
   0x0000000000569407 <+87>:    mov    %rax,-0xa0(%rbp)
   0x000000000056940e <+94>:    jmpq   0x569413 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+99>
   0x0000000000569413 <+99>:    mov    -0xa0(%rbp),%rax
   0x000000000056941a <+106>:   mov    %rax,-0x40(%rbp)

163
164       assert(mRaw->dim.y > 0);
   0x000000000056941e <+110>:   mov    -0x90(%rbp),%rcx
   0x0000000000569425 <+117>:   add    $0x8,%rcx
   0x0000000000569429 <+121>:   mov    %rcx,%rdi
   0x000000000056942c <+124>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x0000000000569431 <+129>:   mov    %rax,-0xa8(%rbp)
   0x0000000000569438 <+136>:   jmpq   0x56943d 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+141>
   0x000000000056943d <+141>:   mov    -0xa8(%rbp),%rax
   0x0000000000569444 <+148>:   cmpl   $0x0,0x2c(%rax)
   0x0000000000569448 <+152>:   jle    0x569453 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+163>
   0x000000000056944e <+158>:   jmpq   0x569489 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+217>
   0x0000000000569453 <+163>:   lea    0x18731(%rip),%rdi        # 0x581b8b
   0x000000000056945a <+170>:   lea    0x21c84(%rip),%rsi        # 0x58b0e5
   0x0000000000569461 <+177>:   mov    $0xa4,%edx
   0x0000000000569466 <+182>:   lea    0x2207e(%rip),%rcx        # 0x58b4eb
   0x000000000056946d <+189>:   callq  0x4c5d20 <__assert_fail at plt>
   0x0000000000569472 <+194>:   lea    -0x38(%rbp),%rdi

165       assert(mRaw->dim.x > 0);
   0x0000000000569489 <+217>:   mov    -0x90(%rbp),%rax
   0x0000000000569490 <+224>:   add    $0x8,%rax
   0x0000000000569494 <+228>:   mov    %rax,%rdi
   0x0000000000569497 <+231>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x000000000056949c <+236>:   mov    %rax,-0xb0(%rbp)
   0x00000000005694a3 <+243>:   jmpq   0x5694a8 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+248>
   0x00000000005694a8 <+248>:   mov    -0xb0(%rbp),%rax
   0x00000000005694af <+255>:   cmpl   $0x0,0x28(%rax)
   0x00000000005694b3 <+259>:   jle    0x5694be 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+270>
   0x00000000005694b9 <+265>:   jmpq   0x5694dd 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+301>
   0x00000000005694be <+270>:   lea    0x186b6(%rip),%rdi        # 0x581b7b
   0x00000000005694c5 <+277>:   lea    0x21c19(%rip),%rsi        # 0x58b0e5
   0x00000000005694cc <+284>:   mov    $0xa5,%edx
   0x00000000005694d1 <+289>:   lea    0x22013(%rip),%rcx        # 0x58b4eb
   0x00000000005694d8 <+296>:   callq  0x4c5d20 <__assert_fail at plt>

166       assert(mRaw->dim.x % 2 == 0);
   0x00000000005694dd <+301>:   mov    -0x90(%rbp),%rax
   0x00000000005694e4 <+308>:   add    $0x8,%rax
   0x00000000005694e8 <+312>:   mov    %rax,%rdi
   0x00000000005694eb <+315>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x00000000005694f0 <+320>:   mov    %rax,-0xb8(%rbp)
   0x00000000005694f7 <+327>:   jmpq   0x5694fc 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+332>
   0x00000000005694fc <+332>:   mov    $0x2,%eax
   0x0000000000569501 <+337>:   mov    -0xb8(%rbp),%rcx
   0x0000000000569508 <+344>:   mov    0x28(%rcx),%edx
   0x000000000056950b <+347>:   mov    %eax,-0xbc(%rbp)
   0x0000000000569511 <+353>:   mov    %edx,%eax
   0x0000000000569513 <+355>:   cltd   
   0x0000000000569514 <+356>:   mov    -0xbc(%rbp),%esi
   0x000000000056951a <+362>:   idiv   %esi
   0x000000000056951c <+364>:   cmp    $0x0,%edx
   0x000000000056951f <+367>:   jne    0x56952a 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+378>
   0x0000000000569525 <+373>:   jmpq   0x569549 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+409>
   0x000000000056952a <+378>:   lea    0x21f8e(%rip),%rdi        # 0x58b4bf
   0x0000000000569531 <+385>:   lea    0x21bad(%rip),%rsi        # 0x58b0e5
   0x0000000000569538 <+392>:   mov    $0xa6,%edx
   0x000000000056953d <+397>:   lea    0x21fa7(%rip),%rcx        # 0x58b4eb
   0x0000000000569544 <+404>:   callq  0x4c5d20 <__assert_fail at plt>

167       assert(row_end <= mRaw->dim.y);
   0x0000000000569549 <+409>:   mov    -0x10(%rbp),%eax
   0x000000000056954c <+412>:   mov    -0x90(%rbp),%rcx
   0x0000000000569553 <+419>:   add    $0x8,%rcx
   0x0000000000569557 <+423>:   mov    %rcx,%rdi
   0x000000000056955a <+426>:   mov    %eax,-0xc0(%rbp)
   0x0000000000569560 <+432>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x0000000000569565 <+437>:   mov    %rax,-0xc8(%rbp)
   0x000000000056956c <+444>:   jmpq   0x569571 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+449>
   0x0000000000569571 <+449>:   mov    -0xc0(%rbp),%eax
   0x0000000000569577 <+455>:   mov    -0xc8(%rbp),%rcx
   0x000000000056957e <+462>:   cmp    0x2c(%rcx),%eax
   0x0000000000569581 <+465>:   jg     0x56958c 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+476>
   0x0000000000569587 <+471>:   jmpq   0x5695ab 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+507>
   0x000000000056958c <+476>:   lea    0x21f41(%rip),%rdi        # 0x58b4d4
   0x0000000000569593 <+483>:   lea    0x21b4b(%rip),%rsi        # 0x58b0e5
   0x000000000056959a <+490>:   mov    $0xa7,%edx
   0x000000000056959f <+495>:   lea    0x21f45(%rip),%rcx        # 0x58b4eb
   0x00000000005695a6 <+502>:   callq  0x4c5d20 <__assert_fail at plt>
   0x00000000005695ab <+507>:   xor    %esi,%esi
   0x00000000005695ad <+509>:   mov    $0x10,%eax
   0x00000000005695b2 <+514>:   mov    %eax,%edx
   0x00000000005695b4 <+516>:   lea    -0x60(%rbp),%rcx

168
169       int pUp[2][2] = {{0, 0}, {0, 0}};
   0x00000000005695b8 <+520>:   mov    %rcx,%rdi
   0x00000000005695bb <+523>:   callq  0x4c60f0 <memset at plt>

170
171       for (int y = row_start; y < row_end && mRaw->dim.x >= 2; y++) {
   0x00000000005695c0 <+528>:   mov    -0xc(%rbp),%eax
   0x00000000005695c3 <+531>:   mov    %eax,-0x64(%rbp)
   0x00000000005695c6 <+534>:   xor    %eax,%eax
   0x00000000005695c8 <+536>:   mov    %al,%cl
   0x00000000005695ca <+538>:   mov    -0x64(%rbp),%eax
   0x00000000005695cd <+541>:   cmp    -0x10(%rbp),%eax
   0x00000000005695d0 <+544>:   mov    %cl,-0xc9(%rbp)
   0x00000000005695d6 <+550>:   jge    0x56960f 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+607>
   0x00000000005695dc <+556>:   mov    -0x90(%rbp),%rax
   0x00000000005695e3 <+563>:   add    $0x8,%rax
   0x00000000005695e7 <+567>:   mov    %rax,%rdi
   0x00000000005695ea <+570>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x00000000005695ef <+575>:   mov    %rax,-0xd8(%rbp)
   0x00000000005695f6 <+582>:   jmpq   0x5695fb 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+587>
   0x00000000005695fb <+587>:   mov    -0xd8(%rbp),%rax
   0x0000000000569602 <+594>:   cmpl   $0x2,0x28(%rax)
   0x0000000000569606 <+598>:   setge  %cl
   0x0000000000569609 <+601>:   mov    %cl,-0xc9(%rbp)
   0x000000000056960f <+607>:   mov    -0xc9(%rbp),%al
   0x0000000000569615 <+613>:   test   $0x1,%al
   0x0000000000569617 <+615>:   jne    0x569622 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+626>
   0x000000000056961d <+621>:   jmpq   0x569883 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1235>
   0x0000000000569875 <+1221>:  mov    -0x64(%rbp),%eax
   0x0000000000569878 <+1224>:  add    $0x1,%eax
   0x000000000056987b <+1227>:  mov    %eax,-0x64(%rbp)
   0x000000000056987e <+1230>:  jmpq   0x5695c6 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+534>
   0x0000000000569883 <+1235>:  lea    -0x38(%rbp),%rdi

172         auto* dest = reinterpret_cast<ushort16*>(&draw[y * mRaw->pitch]);
   0x0000000000569622 <+626>:   mov    -0x40(%rbp),%rax
   0x0000000000569626 <+630>:   mov    -0x64(%rbp),%ecx
   0x0000000000569629 <+633>:   mov    -0x90(%rbp),%rdx
   0x0000000000569630 <+640>:   add    $0x8,%rdx
   0x0000000000569634 <+644>:   mov    %rdx,%rdi
   0x0000000000569637 <+647>:   mov    %rax,-0xe0(%rbp)
   0x000000000056963e <+654>:   mov    %ecx,-0xe4(%rbp)
   0x0000000000569644 <+660>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x0000000000569649 <+665>:   mov    %rax,-0xf0(%rbp)
   0x0000000000569650 <+672>:   jmpq   0x569655 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+677>
   0x0000000000569655 <+677>:   mov    -0xe4(%rbp),%eax
   0x000000000056965b <+683>:   mov    -0xf0(%rbp),%rcx
   0x0000000000569662 <+690>:   imul   0x30(%rcx),%eax
   0x0000000000569666 <+694>:   mov    %eax,%eax
   0x0000000000569668 <+696>:   mov    %eax,%edx
   0x000000000056966a <+698>:   mov    -0xe0(%rbp),%rsi
   0x0000000000569671 <+705>:   add    %rdx,%rsi
   0x0000000000569674 <+708>:   mov    %rsi,-0x70(%rbp)

173
174         int pred[2];
175
176         // first two pixels of the row
177         if (TM != ThreadingModel::SlaveThread) {
178           // decode differences, do prediction, store predicted values
179           dest[0] = pred[0] = pUp[0][y & 1] += ht.decodeNext(bs);
180           dest[1] = pred[1] = pUp[1][y & 1] += ht.decodeNext(bs);
181         } else {
182           // already predicted, just read initial predictor values.
183           pred[0] = dest[0];
   0x0000000000569678 <+712>:   mov    -0x70(%rbp),%rdx
   0x000000000056967c <+716>:   movzwl (%rdx),%eax
   0x000000000056967f <+719>:   mov    %eax,-0x78(%rbp)

184           pred[1] = dest[1];
   0x0000000000569682 <+722>:   mov    -0x70(%rbp),%rdx
   0x0000000000569686 <+726>:   movzwl 0x2(%rdx),%eax
   0x000000000056968a <+730>:   mov    %eax,-0x74(%rbp)

185         }
186
187         for (int x = 2; x < mRaw->dim.x; x += 2) {
   0x000000000056968d <+733>:   movl   $0x2,-0x7c(%rbp)
   0x0000000000569694 <+740>:   mov    -0x7c(%rbp),%eax
   0x0000000000569697 <+743>:   mov    -0x90(%rbp),%rcx
   0x000000000056969e <+750>:   add    $0x8,%rcx
   0x00000000005696a2 <+754>:   mov    %rcx,%rdi
   0x00000000005696a5 <+757>:   mov    %eax,-0xf4(%rbp)
   0x00000000005696ab <+763>:   callq  0x4ca770 <rawspeed::RawImage::operator-
>() const>
   0x00000000005696b0 <+768>:   mov    %rax,-0x100(%rbp)
   0x00000000005696b7 <+775>:   jmpq   0x5696bc 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+780>
   0x00000000005696bc <+780>:   mov    -0xf4(%rbp),%eax
   0x00000000005696c2 <+786>:   mov    -0x100(%rbp),%rcx
   0x00000000005696c9 <+793>:   cmp    0x28(%rcx),%eax
   0x00000000005696cc <+796>:   jge    0x569870 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1216>
   0x0000000000569862 <+1202>:  mov    -0x7c(%rbp),%eax
   0x0000000000569865 <+1205>:  add    $0x2,%eax
   0x0000000000569868 <+1208>:  mov    %eax,-0x7c(%rbp)
   0x000000000056986b <+1211>:  jmpq   0x569694 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+740>

188           int diff[2];
189
190           if (TM != ThreadingModel::SlaveThread) {
191             // if this is not the prediction slave threads, decode next 
difference
192             diff[0] = ht.decodeNext(bs);
193             diff[1] = ht.decodeNext(bs);
194           } else {
195             // else, read next difference from the the output
196             diff[0] = dest[x];
   0x00000000005696d2 <+802>:   mov    -0x70(%rbp),%rax
   0x00000000005696d6 <+806>:   movslq -0x7c(%rbp),%rcx
   0x00000000005696da <+810>:   movzwl (%rax,%rcx,2),%edx
   0x00000000005696de <+814>:   mov    %edx,-0x84(%rbp)

197             diff[1] = dest[x + 1];
   0x00000000005696e4 <+820>:   mov    -0x70(%rbp),%rax
   0x00000000005696e8 <+824>:   mov    -0x7c(%rbp),%edx
   0x00000000005696eb <+827>:   add    $0x1,%edx
   0x00000000005696ee <+830>:   movslq %edx,%rcx
   0x00000000005696f1 <+833>:   movzwl (%rax,%rcx,2),%edx
   0x00000000005696f5 <+837>:   mov    %edx,-0x80(%rbp)

198           }
199
200           if (TM == ThreadingModel::MainThread) {
201             // if this is the main thread, just store the differences
202             dest[x] = diff[0];
203             dest[x + 1] = diff[1];
204           } else {
205             // else, do prediction, store predicted values
206             pred[0] += diff[0];
   0x00000000005696f8 <+840>:   mov    -0x84(%rbp),%edx
   0x00000000005696fe <+846>:   add    -0x78(%rbp),%edx
   0x0000000000569701 <+849>:   mov    %edx,-0x78(%rbp)

207             pred[1] += diff[1];
   0x0000000000569704 <+852>:   mov    -0x80(%rbp),%edx
   0x0000000000569707 <+855>:   add    -0x74(%rbp),%edx
   0x000000000056970a <+858>:   mov    %edx,-0x74(%rbp)

208
209             dest[x] = pred[0];
   0x000000000056970d <+861>:   mov    -0x78(%rbp),%edx
   0x0000000000569710 <+864>:   mov    %dx,%si
   0x0000000000569713 <+867>:   mov    -0x70(%rbp),%rax
   0x0000000000569717 <+871>:   movslq -0x7c(%rbp),%rcx
   0x000000000056971b <+875>:   mov    %si,(%rax,%rcx,2)

210             dest[x + 1] = pred[1];
   0x000000000056971f <+879>:   mov    -0x74(%rbp),%edx
   0x0000000000569722 <+882>:   mov    %dx,%si
   0x0000000000569725 <+885>:   mov    -0x70(%rbp),%rax
   0x0000000000569729 <+889>:   mov    -0x7c(%rbp),%edx
   0x000000000056972c <+892>:   add    $0x1,%edx
   0x000000000056972f <+895>:   movslq %edx,%rcx
   0x0000000000569732 <+898>:   mov    %si,(%rax,%rcx,2)

211
212             assert(dest[x] == pred[0]);
   0x0000000000569736 <+902>:   mov    -0x70(%rbp),%rax
   0x000000000056973a <+906>:   movslq -0x7c(%rbp),%rcx
   0x000000000056973e <+910>:   movzwl (%rax,%rcx,2),%edx
   0x0000000000569742 <+914>:   cmp    -0x78(%rbp),%edx
   0x0000000000569745 <+917>:   jne    0x569750 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+928>
   0x000000000056974b <+923>:   jmpq   0x56976f 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+959>
   0x0000000000569750 <+928>:   lea    0x21e1b(%rip),%rdi        # 0x58b572
   0x0000000000569757 <+935>:   lea    0x21987(%rip),%rsi        # 0x58b0e5
   0x000000000056975e <+942>:   mov    $0xd4,%edx
   0x0000000000569763 <+947>:   lea    0x21d81(%rip),%rcx        # 0x58b4eb
   0x000000000056976a <+954>:   callq  0x4c5d20 <__assert_fail at plt>

213             assert(dest[x + 1] == pred[1]);
=> 0x000000000056976f <+959>:   mov    -0x70(%rbp),%rax
   0x0000000000569773 <+963>:   mov    -0x7c(%rbp),%ecx
   0x0000000000569776 <+966>:   add    $0x1,%ecx
   0x0000000000569779 <+969>:   movslq %ecx,%rdx
   0x000000000056977c <+972>:   movzwl (%rax,%rdx,2),%ecx
   0x0000000000569780 <+976>:   cmp    -0x74(%rbp),%ecx
   0x0000000000569783 <+979>:   jne    0x56978e 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+990>
   0x0000000000569789 <+985>:   jmpq   0x5697ad 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1021>
   0x000000000056978e <+990>:   lea    0x21df0(%rip),%rdi        # 0x58b585
   0x0000000000569795 <+997>:   lea    0x21949(%rip),%rsi        # 0x58b0e5
   0x000000000056979c <+1004>:  mov    $0xd5,%edx
   0x00000000005697a1 <+1009>:  lea    0x21d43(%rip),%rcx        # 0x58b4eb
   0x00000000005697a8 <+1016>:  callq  0x4c5d20 <__assert_fail at plt>

214
215             if (dest[x] < 0 || dest[x] > 65535)
   0x00000000005697ad <+1021>:  mov    -0x70(%rbp),%rax
   0x00000000005697b1 <+1025>:  movslq -0x7c(%rbp),%rcx
   0x00000000005697b5 <+1029>:  movzwl (%rax,%rcx,2),%edx
   0x00000000005697b9 <+1033>:  cmp    $0x0,%edx
   0x00000000005697bc <+1036>:  jl     0x5697da 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1066>
   0x00000000005697c2 <+1042>:  mov    -0x70(%rbp),%rax
   0x00000000005697c6 <+1046>:  movslq -0x7c(%rbp),%rcx
   0x00000000005697ca <+1050>:  movzwl (%rax,%rcx,2),%edx
   0x00000000005697ce <+1054>:  cmp    $0xffff,%edx
   0x00000000005697d4 <+1060>:  jle    0x569800 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1104>

216               ThrowRDE("decoded value out of bounds at (%d, %d)", x, y);
   0x00000000005697da <+1066>:  mov    -0x7c(%rbp),%edx
   0x00000000005697dd <+1069>:  mov    -0x64(%rbp),%ecx
   0x00000000005697e0 <+1072>:  lea    0x21db5(%rip),%rdi        # 0x58b59c
   0x00000000005697e7 <+1079>:  lea    0x21cfd(%rip),%rsi        # 0x58b4eb
   0x00000000005697ee <+1086>:  xor    %eax,%eax
   0x00000000005697f0 <+1088>:  mov    %al,%r8b
   0x00000000005697f3 <+1091>:  mov    %r8b,%al
   0x00000000005697f6 <+1094>:  callq  0x4d6550 
<rawspeed::ThrowException<rawspeed::RawDecoderException>(char const*, ...)>
   0x00000000005697fb <+1099>:  jmpq   0x569800 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1104>

217             if (dest[x + 1] < 0 || dest[x + 1] > 65535)
   0x0000000000569800 <+1104>:  mov    -0x70(%rbp),%rax
   0x0000000000569804 <+1108>:  mov    -0x7c(%rbp),%ecx
   0x0000000000569807 <+1111>:  add    $0x1,%ecx
   0x000000000056980a <+1114>:  movslq %ecx,%rdx
   0x000000000056980d <+1117>:  movzwl (%rax,%rdx,2),%ecx
   0x0000000000569811 <+1121>:  cmp    $0x0,%ecx
   0x0000000000569814 <+1124>:  jl     0x569837 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1159>
   0x000000000056981a <+1130>:  mov    -0x70(%rbp),%rax
   0x000000000056981e <+1134>:  mov    -0x7c(%rbp),%ecx
   0x0000000000569821 <+1137>:  add    $0x1,%ecx
   0x0000000000569824 <+1140>:  movslq %ecx,%rdx
   0x0000000000569827 <+1143>:  movzwl (%rax,%rdx,2),%ecx
   0x000000000056982b <+1147>:  cmp    $0xffff,%ecx
   0x0000000000569831 <+1153>:  jle    0x56985d 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1197>

218               ThrowRDE("decoded value out of bounds at (%d, %d)", x, y);
   0x0000000000569837 <+1159>:  mov    -0x7c(%rbp),%edx
   0x000000000056983a <+1162>:  mov    -0x64(%rbp),%ecx
   0x000000000056983d <+1165>:  lea    0x21dd7(%rip),%rdi        # 0x58b61b
   0x0000000000569844 <+1172>:  lea    0x21ca0(%rip),%rsi        # 0x58b4eb
   0x000000000056984b <+1179>:  xor    %eax,%eax
   0x000000000056984d <+1181>:  mov    %al,%r8b
   0x0000000000569850 <+1184>:  mov    %r8b,%al
   0x0000000000569853 <+1187>:  callq  0x4d6550 
<rawspeed::ThrowException<rawspeed::RawDecoderException>(char const*, ...)>
   0x0000000000569858 <+1192>:  jmpq   0x56985d 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1197>

219           }
220         }
   0x000000000056985d <+1197>:  jmpq   0x569862 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1202>

221       }
   0x0000000000569870 <+1216>:  jmpq   0x569875 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1221>

222     }
   0x0000000000569476 <+198>:   mov    %edx,%ecx
   0x0000000000569478 <+200>:   mov    %rax,-0x48(%rbp)
   0x000000000056947c <+204>:   mov    %ecx,-0x4c(%rbp)
   0x000000000056947f <+207>:   callq  0x4f9290 
<rawspeed::BitStream<rawspeed::MSBBitPumpTag, 
rawspeed::BitStreamCacheRightInLeftOut>::~BitStream()>
   0x0000000000569484 <+212>:   jmpq   0x569895 
<rawspeed::PentaxDecompressor::decompressInternal<(rawspeed::PentaxDecompressor::ThreadingModel)2>(int, 
int) const+1253>
   0x0000000000569887 <+1239>:  callq  0x4f9290 
<rawspeed::BitStream<rawspeed::MSBBitPumpTag, 
rawspeed::BitStreamCacheRightInLeftOut>::~BitStream()>
   0x000000000056988c <+1244>:  add    $0x100,%rsp
   0x0000000000569893 <+1251>:  pop    %rbp
   0x0000000000569894 <+1252>:  retq   
   0x0000000000569895 <+1253>:  mov    -0x48(%rbp),%rdi
   0x0000000000569899 <+1257>:  callq  0x4c5c40 <_Unwind_Resume at plt>

End of assembler dump.

Roman.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170811/2d03e95a/attachment-0001.sig>


More information about the llvm-dev mailing list