operator new[] overflow (PR 19351)

Chris Lattner clattner@apple.com
Sun Dec 5 17:49:00 GMT 2010


On Dec 5, 2010, at 3:19 AM, Richard Guenther wrote:

>> $ clang t.cc -S -o - -O3 -mkernel -fomit-frame-pointer -mllvm -show-mc-encoding
>>        .section        __TEXT,__text,regular,pure_instructions
>>        .globl  __Z4testl
>>        .align  4, 0x90
>> __Z4testl:                              ## @_Z4testl
>> ## BB#0:                                ## %entry
>>        movl    $4, %ecx                ## encoding: [0xb9,0x04,0x00,0x00,0x00]
>>        movq    %rdi, %rax              ## encoding: [0x48,0x89,0xf8]
>>        mulq    %rcx                    ## encoding: [0x48,0xf7,0xe1]
>>        movq    $-1, %rdi               ## encoding: [0x48,0xc7,0xc7,0xff,0xff,0xff,0xff]
>>        cmovnoq %rax, %rdi              ## encoding: [0x48,0x0f,0x41,0xf8]
>>        jmp     __Znam                  ## TAILCALL
>>                                        ## encoding: [0xeb,A]
>>                                        ##   fixup A - offset: 1, value: __Znam-1, kind: FK_PCRel_1
>> .subsections_via_symbols
>> 
>> This could be further improved by inverting the cmov condition to avoid the first movq, which we'll tackle as a general regalloc improvement.
> 
> I'm curious as on how you represent the overflow checking in your highlevel IL.

The (optimized) generated IR is:

$ clang t.cc -emit-llvm -S -o - -O3
...
define noalias i8* @_Z4testl(i64 %count) ssp {
entry:
  %0 = tail call %0 @llvm.umul.with.overflow.i64(i64 %count, i64 4)
  %1 = extractvalue %0 %0, 1
  %2 = extractvalue %0 %0, 0
  %3 = select i1 %1, i64 -1, i64 %2
  %call = tail call noalias i8* @_Znam(i64 %3)
  ret i8* %call
}

More information on the overflow intrinsics is here:
http://llvm.org/docs/LangRef.html#int_overflow

-Chris



More information about the Gcc mailing list