Skip to content

Commit

Permalink
[CGP] don't expand a memcmp with nobuiltin attribute
Browse files Browse the repository at this point in the history
This matches the behavior used in the SDAG when expanding memcmp.

For reference, we're intentionally treating the earlier fortified call transforms differently after:
https://bugs.llvm.org/show_bug.cgi?id=23093
https://reviews.llvm.org/rL233776

One motivation for not transforming nobuiltin calls is that it can interfere with sanitizers:
https://reviews.llvm.org/D19781
https://reviews.llvm.org/D19801

Differential Revision: https://reviews.llvm.org/D34043

llvm-svn: 305007
  • Loading branch information
rotateright committed Jun 8, 2017
1 parent 3271d37 commit 5e37085
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
8 changes: 8 additions & 0 deletions llvm/include/llvm/Analysis/TargetLibraryInfo.h
Expand Up @@ -13,6 +13,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/Triple.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
Expand Down Expand Up @@ -239,6 +240,13 @@ class TargetLibraryInfo {
return Impl->getLibFunc(FDecl, F);
}

/// If a callsite does not have the 'nobuiltin' attribute, return if the
/// called function is a known library function and set F to that function.
bool getLibFunc(ImmutableCallSite CS, LibFunc & F) const {
return !CS.isNoBuiltin() && CS.getCalledFunction() &&
getLibFunc(*(CS.getCalledFunction()), F);
}

/// Tests whether a library function is available.
bool has(LibFunc F) const {
return Impl->getState(F) != TargetLibraryInfoImpl::Unavailable;
Expand Down
10 changes: 4 additions & 6 deletions llvm/lib/CodeGen/CodeGenPrepare.cpp
Expand Up @@ -2406,12 +2406,10 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool& ModifiedDT) {
}

LibFunc Func;
if (TLInfo->getLibFunc(*CI->getCalledFunction(), Func) &&
Func == LibFunc_memcmp) {
if (expandMemCmp(CI, TTI, TLI, DL)) {
ModifiedDT = true;
return true;
}
if (TLInfo->getLibFunc(ImmutableCallSite(CI), Func) &&
Func == LibFunc_memcmp && expandMemCmp(CI, TTI, TLI, DL)) {
ModifiedDT = true;
return true;
}
return false;
}
Expand Down
21 changes: 15 additions & 6 deletions llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll
Expand Up @@ -199,12 +199,21 @@ define signext i32 @zeroEqualityTest06() {
define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) {
; CHECK-LABEL: length2_eq_nobuiltin_attr:
; CHECK: # BB#0:
; CHECK-NEXT: lhz 3, 0(3)
; CHECK-NEXT: lhz 4, 0(4)
; CHECK-NEXT: li 5, 0
; CHECK-NEXT: li 12, 1
; CHECK-NEXT: cmpw 3, 4
; CHECK-NEXT: isel 3, 12, 5, 2
; CHECK-NEXT: mflr 0
; CHECK-NEXT: std 0, 16(1)
; CHECK-NEXT: stdu 1, -32(1)
; CHECK-NEXT: .Lcfi0:
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: .Lcfi1:
; CHECK-NEXT: .cfi_offset lr, 16
; CHECK-NEXT: li 5, 2
; CHECK-NEXT: bl memcmp
; CHECK-NEXT: nop
; CHECK-NEXT: cntlzw 3, 3
; CHECK-NEXT: rlwinm 3, 3, 27, 31, 31
; CHECK-NEXT: addi 1, 1, 32
; CHECK-NEXT: ld 0, 16(1)
; CHECK-NEXT: mtlr 0
; CHECK-NEXT: blr
%m = tail call signext i32 @memcmp(i8* %X, i8* %Y, i64 2) nobuiltin
%c = icmp eq i32 %m, 0
Expand Down

0 comments on commit 5e37085

Please sign in to comment.