[llvm-commits] [llvm] r61297 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/2008-12-20-StrcmpMemcmp.ll
Chris Lattner
clattner at apple.com
Tue Dec 23 09:24:13 PST 2008
On Dec 23, 2008, at 4:17 AM, Török Edwin wrote:
>> This is a really important question that I don't know the answer to.
>> My understanding is that memcmp only touches the bytes necessary to
>> make a decision: it is not allowed to touch the full size if
>> unneeded. However, I don't really *know* that, and nothing I find
>> online in a quick scan comes up with an obvious answer.
>>
>> Can you try asking on comp.lang.c or something like that?
>
> I found 2 messages on comp.lang.c about this:
> http://groups.google.com/group/comp.lang.c/msg/28fcc4a0e29e5339
> http://groups.google.com/group/comp.lang.c/msg/786c9f1cb2e9b085
>
> " /* or can probably use memcmp since in practice it will safely
> stop on or near null != nonnull and return nonmatch, but not
> AFAICT guaranteed, and being not str* may alarm some */
>
> You seem to be correct - "7.21.4.1 The memcmp function" doesn't
> require it
> to stop as long as it ultimately returns the correct result - but
> it's in
> the implementation's interests to make it as efficient as possible."
Ok. This means that it should be opt-in on a per-target basis.
>> It would
>> also be interesting to look at the source for various memcmp
>> implementations
>
> glibc:
> However in memcmp_not_common_alignment:
> /* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2
> with LEN
> `op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory
> operations on `op_t', but SRCP1 *should be unaligned*. */
> switch (len % 4) {
> case 2:
> a1 = ((op_t *) srcp1)[0];
> a2 = ((op_t *) srcp1)[1];
> ...
> }
>
> It does a 2-byte read on srcp1, which is unaligned, so I think it may
> cross a page boundary if we aren't allowed to do 2-byte reads on all
> the
> region we pass to memcmp.
opt_t is 16-bits? That is unfortunate, it means we can't do the
optimization on glibc. :(
>> to decide if they are safe on commonly available
>> systems (worst-case this becomes a target-specific optimization).
>>
>
> How about using the alignment and length of the string to determine
> that
> memcmp won't cross a page boundary, even
> with an implementation that does 8-byte reads always?
> Alternatively we may align the operands with some extra code inserted.
The problem is that we usually can't know the alignment of the non-
constant string.
-Chris
More information about the llvm-commits
mailing list