mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[PartiallyInlineLibCalls] Add DebugCounter support
This adds DebugCounter support to the PartiallyInlineLibCalls pass, which should make debugging/automated bisection easier in the future. Patch by Zhizhou Yang! Differential Revision: https://reviews.llvm.org/D50093 llvm-svn: 342172
This commit is contained in:
parent
2374d412bf
commit
9c4f29f0ca
@ -17,6 +17,7 @@
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/Support/DebugCounter.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
|
||||
@ -24,6 +25,8 @@ using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "partially-inline-libcalls"
|
||||
|
||||
DEBUG_COUNTER(PILCounter, "partially-inline-libcalls-transform",
|
||||
"Controls transformations in partially-inline-libcalls");
|
||||
|
||||
static bool optimizeSQRT(CallInst *Call, Function *CalledFunc,
|
||||
BasicBlock &CurrBB, Function::iterator &BB,
|
||||
@ -33,6 +36,9 @@ static bool optimizeSQRT(CallInst *Call, Function *CalledFunc,
|
||||
if (Call->onlyReadsMemory())
|
||||
return false;
|
||||
|
||||
if (!DebugCounter::shouldExecute(PILCounter))
|
||||
return false;
|
||||
|
||||
// Do the following transformation:
|
||||
//
|
||||
// (before)
|
||||
|
44
test/Other/X86/debugcounter-partiallyinlinelibcalls.ll
Normal file
44
test/Other/X86/debugcounter-partiallyinlinelibcalls.ll
Normal file
@ -0,0 +1,44 @@
|
||||
; REQUIRES: asserts
|
||||
; RUN: opt -S -debug-counter=partially-inline-libcalls-transform-skip=1,partially-inline-libcalls-transform-count=1 \
|
||||
; RUN: -partially-inline-libcalls -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
|
||||
;; Test that, with debug counters on, we will skip the first optimization opportunity, perform next 1,
|
||||
;; and ignore all the others left.
|
||||
|
||||
define float @f1(float %val) {
|
||||
; CHECK-LABEL: @f1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[RES:%.*]] = tail call float @sqrtf(float [[VAL:%.*]])
|
||||
; CHECK-NEXT: ret float [[RES:%.*]]
|
||||
entry:
|
||||
%res = tail call float @sqrtf(float %val)
|
||||
ret float %res
|
||||
}
|
||||
|
||||
define float @f2(float %val) {
|
||||
; CHECK-LABEL: @f2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[RES:%.*]] = tail call float @sqrtf(float [[VAL:%.*]]) #0
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = fcmp oge float [[VAL]], 0.000000e+00
|
||||
; CHECK-NEXT: br i1 [[TMP0]], label [[ENTRY_SPLIT:%.*]], label [[CALL_SQRT:%.*]]
|
||||
; CHECK: call.sqrt:
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call float @sqrtf(float [[VAL]])
|
||||
; CHECK-NEXT: br label [[ENTRY_SPLIT]]
|
||||
; CHECK: entry.split:
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = phi float [ [[RES]], [[ENTRY:%.*]] ], [ [[TMP1]], [[CALL_SQRT]] ]
|
||||
; CHECK-NEXT: ret float [[TMP2]]
|
||||
entry:
|
||||
%res = tail call float @sqrtf(float %val)
|
||||
ret float %res
|
||||
}
|
||||
|
||||
define float @f3(float %val) {
|
||||
; CHECK-LABEL: @f3(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[RES:%.*]] = tail call float @sqrtf(float [[VAL:%.*]])
|
||||
; CHECK-NEXT: ret float [[RES:%.*]]
|
||||
entry:
|
||||
%res = tail call float @sqrtf(float %val)
|
||||
ret float %res
|
||||
}
|
||||
|
||||
declare float @sqrtf(float)
|
Loading…
Reference in New Issue
Block a user