summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-01-09 07:47:06 +0000
committerChris Lattner <sabre@nondot.org>2009-01-09 07:47:06 +0000
commitf50aa6ae5c4b15f24f9f72bc83b635e48e520f28 (patch)
tree32f885daa347c7d7f82c92cd8e964ee76b0ddbdb /clang/lib/CodeGen/CGExprConstant.cpp
parent0f7cf1d7e194a2c9c8b529e0d6015368c38fcb05 (diff)
downloadbcm5719-llvm-f50aa6ae5c4b15f24f9f72bc83b635e48e520f28.tar.gz
bcm5719-llvm-f50aa6ae5c4b15f24f9f72bc83b635e48e520f28.zip
Implement rdar://6480391, extending of equality icmp's to avoid a truncation.
I noticed this in the code compiled for a routine using std::map, which produced this code: %25 = tail call i32 @memcmp(i8* %24, i8* %23, i32 6) nounwind readonly %.lobit.i = lshr i32 %25, 31 ; <i32> [#uses=1] %tmp.i = trunc i32 %.lobit.i to i8 ; <i8> [#uses=1] %toBool = icmp eq i8 %tmp.i, 0 ; <i1> [#uses=1] br i1 %toBool, label %bb3, label %bb4 which compiled to: call L_memcmp$stub shrl $31, %eax testb %al, %al jne LBB1_11 ## with this change, we compile it to: call L_memcmp$stub testl %eax, %eax js LBB1_11 This triggers all the time in common code, with patters like this: %169 = and i32 %ply, 1 ; <i32> [#uses=1] %170 = trunc i32 %169 to i8 ; <i8> [#uses=1] %toBool = icmp ne i8 %170, 0 ; <i1> [#uses=1] %7 = lshr i32 %6, 24 ; <i32> [#uses=1] %9 = trunc i32 %7 to i8 ; <i8> [#uses=1] %10 = icmp ne i8 %9, 0 ; <i1> [#uses=1] etc llvm-svn: 61985
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud