Skip to content

Commit 25753bb

Browse files
ktrifunovicgfxbot
authored andcommitted
This is a temporary solution in order to transition to system provided LLVM releases. Since we will not anymore patch LLVM sources, we need to customize some LLVM passes for the desired behavior.
InstCombiner, by default, performs instruction sinking while doing combining. This causes multiple negative effects (breaking I/O coalesicng, increasing register pressure). the solution so far was to apply a patch to LLVM code base to disable this. Since we do not use patches on LLVM anymore, we copy over the pass into IGC codebase and customize it. A discussion is undergoing to include some of those customizations into LLVM trunk, nevertheless that would happen after LLVM 7.0 transition. At that point, this checkin should be removed to keep the design clean. Change-Id: I14cc6870ec046a85ccd721f92435ded1d98df1f8
1 parent 432c310 commit 25753bb

21 files changed

+28956
-73
lines changed

IGC/AdaptorOCL/UnifyIROCL.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
104104
#include "Compiler/MetaDataUtilsWrapper.h"
105105
#include "Compiler/SPIRMetaDataTranslation.h"
106106
#include "Compiler/Optimizer/OpenCLPasses/ErrorCheckPass.h"
107+
108+
107109
#include "Compiler/MetaDataApi/IGCMetaDataDefs.h"
108110
#include "Compiler/MetaDataApi/IGCMetaDataHelper.h"
109111
#include "Compiler/CodeGenContextWrapper.hpp"
@@ -112,6 +114,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
112114
#include "Compiler/MetaDataApi/SpirMetaDataApi.h"
113115
#include "Compiler/Optimizer/FixFastMathFlags.hpp"
114116
#include "MoveStaticAllocas.h"
117+
#include "Compiler/Optimizer/IGCInstCombiner/4.0/IGCInstructionCombining.hpp"
115118

116119
#include "common/debug/Debug.hpp"
117120
#include "common/igc_regkeys.hpp"
@@ -397,7 +400,7 @@ static void CommonOCLBasedPasses(
397400
mpm.add(createSimplifyConstantPass());
398401
mpm.add(createPromoteConstantPass());
399402
}
400-
mpm.add(createInstructionCombiningPass());
403+
mpm.add(createIGCInstructionCombiningPass());
401404

402405
// Instcombine can create constant expressions, which are not handled by the program scope constant resolution pass
403406
mpm.add(new BreakConstantExpr());
@@ -415,7 +418,7 @@ static void CommonOCLBasedPasses(
415418

416419
// TODO: Run CheckInstrTypes after builtin import to determine if builtins have allocas.
417420
mpm.add(createSROAPass());
418-
mpm.add(createInstructionCombiningPass());
421+
mpm.add(createIGCInstructionCombiningPass());
419422

420423
// "false" to createScalarizerPass() means that vector load/stores are NOT scalarized
421424
mpm.add(createScalarizerPass(false));

IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
157157
#include "Compiler/Optimizer/SetMathPrecisionForPositionOutput.hpp"
158158
#include "Compiler/DebugInfo/VISADebugEmitter.hpp"
159159
#include "Compiler/SampleCmpToDiscard.h"
160+
#include "Compiler/Optimizer/IGCInstCombiner/4.0/IGCInstructionCombining.hpp"
160161

161162
#include "DebugInfo.hpp"
162163

@@ -489,7 +490,7 @@ inline void AddLegalizationPasses(CodeGenContext &ctx, const CShaderProgram::Ker
489490
if (IGC_IS_FLAG_ENABLED(EnableAdvMemOpt))
490491
mpm.add(createAdvMemOptPass());
491492
mpm.add(createMemOptPass());
492-
mpm.add(llvm::createInstructionCombiningPass());
493+
mpm.add(createIGCInstructionCombiningPass());
493494
}
494495

495496
if (!isOptDisabled &&
@@ -535,7 +536,7 @@ inline void AddLegalizationPasses(CodeGenContext &ctx, const CShaderProgram::Ker
535536
// Optimize lower-level IR
536537
if (!fastCompile)
537538
{
538-
mpm.add(createInstructionCombiningPass());
539+
mpm.add(createIGCInstructionCombiningPass());
539540
}
540541
mpm.add(new GenSpecificPattern());
541542
if (!fastCompile)
@@ -1179,7 +1180,7 @@ void OptimizeIR(CodeGenContext* pContext)
11791180
mpm.add(createGenFDIVEmulation());
11801181
}
11811182

1182-
mpm.add(llvm::createInstructionCombiningPass());
1183+
mpm.add(createIGCInstructionCombiningPass());
11831184
mpm.add(llvm::createDeadCodeEliminationPass()); // this should be done both before/after constant propagation
11841185

11851186
if (pContext->m_instrTypes.hasGenericAddressSpacePointers &&
@@ -1219,7 +1220,7 @@ void OptimizeIR(CodeGenContext* pContext)
12191220
mpm.add(new CustomLoopVersioning());
12201221
}
12211222

1222-
mpm.add(llvm::createInstructionCombiningPass());
1223+
mpm.add(createIGCInstructionCombiningPass());
12231224
if (IGC_IS_FLAG_ENABLED(EnableAdvCodeMotion) &&
12241225
pContext->type == ShaderType::OPENCL_SHADER &&
12251226
!pContext->m_instrTypes.hasSwitch)
@@ -1324,7 +1325,8 @@ void OptimizeIR(CodeGenContext* pContext)
13241325
mpm.add(llvm::createJumpThreadingPass());
13251326

13261327
// run instruction combining to clean up the code after CFG optimizations
1327-
mpm.add(createInstructionCombiningPass());
1328+
mpm.add(createIGCInstructionCombiningPass());
1329+
13281330
mpm.add(llvm::createDeadCodeEliminationPass());
13291331
mpm.add(llvm::createEarlyCSEPass());
13301332

IGC/Compiler/InitializePasses.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ void initializeWIAnalysisPass(llvm::PassRegistry&);
114114
void initializeWIFuncResolutionPass(llvm::PassRegistry&);
115115
void initializeWIFuncsAnalysisPass(llvm::PassRegistry&);
116116
void initializeWorkaroundAnalysisPass(llvm::PassRegistry&);
117-
void initializeWAFMinFMaxPass(llvm::PassRegistry&);
117+
void initializeWAFMinFMaxPass(llvm::PassRegistry&);
118118
void initializePingPongTexturesAnalysisPass(llvm::PassRegistry&);
119119
void initializePingPongTexturesOptPass(llvm::PassRegistry&);
120120
void initializeLinkTessControlShaderPass(llvm::PassRegistry&);
@@ -135,3 +135,5 @@ void initializeCheckInstrTypesPass(llvm::PassRegistry&);
135135
void initializeHalfPromotionPass(llvm::PassRegistry&);
136136
void initializeFixFastMathFlagsPass(llvm::PassRegistry&);
137137
void initializeCodeAssumptionPass(llvm::PassRegistry&);
138+
void initializeIGCInstructionCombiningPassPass(llvm::PassRegistry&);
139+

IGC/Compiler/Optimizer/CMakeLists.txt

Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,69 @@
1-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
2-
3-
add_subdirectory(OpenCLPasses)
4-
add_subdirectory(OpenGLPasses)
5-
6-
set(IGC_BUILD__SRC__Optimizer
7-
"${CMAKE_CURRENT_SOURCE_DIR}/BuiltInFuncImport.cpp"
8-
"${CMAKE_CURRENT_SOURCE_DIR}/InfiniteLoopRemoval.cpp"
9-
"${CMAKE_CURRENT_SOURCE_DIR}/LinkMultiRateShaders.cpp"
10-
"${CMAKE_CURRENT_SOURCE_DIR}/MCSOptimization.cpp"
11-
"${CMAKE_CURRENT_SOURCE_DIR}/GatingSimilarSamples.cpp"
12-
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIConverter.cpp"
13-
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIUtils.cpp"
14-
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncImport.cpp"
15-
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncLibrary.cpp"
16-
"${CMAKE_CURRENT_SOURCE_DIR}/Scalarizer.cpp"
17-
"${CMAKE_CURRENT_SOURCE_DIR}/SetMathPrecisionForPositionOutput.cpp"
18-
"${CMAKE_CURRENT_SOURCE_DIR}/FixFastMathFlags.cpp"
19-
"${CMAKE_CURRENT_SOURCE_DIR}/CodeAssumption.cpp"
20-
"${CMAKE_CURRENT_SOURCE_DIR}/MarkReadOnlyLoad.cpp"
21-
"${CMAKE_CURRENT_SOURCE_DIR}/RectListOptimizationPass.cpp"
22-
)
23-
24-
set(IGC_BUILD__SRC__Compiler_Optimizer
25-
${IGC_BUILD__SRC__Optimizer}
26-
${IGC_BUILD__SRC__Optimizer_OpenCLPasses}
27-
${IGC_BUILD__SRC__Optimizer_OpenGLPasses}
28-
PARENT_SCOPE
29-
)
30-
31-
set(IGC_BUILD__HDR__Optimizer
32-
"${CMAKE_CURRENT_SOURCE_DIR}/BuiltInFuncImport.h"
33-
"${CMAKE_CURRENT_SOURCE_DIR}/InfiniteLoopRemoval.hpp"
34-
"${CMAKE_CURRENT_SOURCE_DIR}/LinkMultiRateShaders.hpp"
35-
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIConverter.h"
36-
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIUtils.h"
37-
"${CMAKE_CURRENT_SOURCE_DIR}/MCSOptimization.hpp"
38-
"${CMAKE_CURRENT_SOURCE_DIR}/GatingSimilarSamples.hpp"
39-
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncImport.hpp"
40-
"${CMAKE_CURRENT_SOURCE_DIR}/Scalarizer.h"
41-
"${CMAKE_CURRENT_SOURCE_DIR}/SetMathPrecisionForPositionOutput.hpp"
42-
"${CMAKE_CURRENT_SOURCE_DIR}/FixFastMathFlags.hpp"
43-
"${CMAKE_CURRENT_SOURCE_DIR}/CodeAssumption.hpp"
44-
"${CMAKE_CURRENT_SOURCE_DIR}/RectListOptimizationPass.hpp"
45-
)
46-
47-
48-
set(IGC_BUILD__HDR__Compiler_Optimizer
49-
${IGC_BUILD__HDR__Optimizer}
50-
${IGC_BUILD__HDR__Optimizer_OpenCLPasses}
51-
${IGC_BUILD__HDR__Optimizer_OpenGLPasses}
52-
PARENT_SCOPE
53-
)
54-
55-
56-
igc_sg_register(
57-
Compiler__Optimizer
58-
"Optimizer"
59-
GROUPS
60-
Compiler__Optimizer_OpenCLPasses
61-
Compiler__Optimizer_OpenGLPasses
62-
FILES
63-
${IGC_BUILD__SRC__Optimizer}
64-
${IGC_BUILD__HDR__Optimizer}
65-
)
1+
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
2+
3+
add_subdirectory(OpenCLPasses)
4+
add_subdirectory(OpenGLPasses)
5+
add_subdirectory(IGCInstCombiner)
6+
7+
set(IGC_BUILD__SRC__Optimizer
8+
"${CMAKE_CURRENT_SOURCE_DIR}/BuiltInFuncImport.cpp"
9+
"${CMAKE_CURRENT_SOURCE_DIR}/InfiniteLoopRemoval.cpp"
10+
"${CMAKE_CURRENT_SOURCE_DIR}/LinkMultiRateShaders.cpp"
11+
"${CMAKE_CURRENT_SOURCE_DIR}/MCSOptimization.cpp"
12+
"${CMAKE_CURRENT_SOURCE_DIR}/GatingSimilarSamples.cpp"
13+
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIConverter.cpp"
14+
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIUtils.cpp"
15+
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncImport.cpp"
16+
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncLibrary.cpp"
17+
"${CMAKE_CURRENT_SOURCE_DIR}/Scalarizer.cpp"
18+
"${CMAKE_CURRENT_SOURCE_DIR}/SetMathPrecisionForPositionOutput.cpp"
19+
"${CMAKE_CURRENT_SOURCE_DIR}/FixFastMathFlags.cpp"
20+
"${CMAKE_CURRENT_SOURCE_DIR}/CodeAssumption.cpp"
21+
"${CMAKE_CURRENT_SOURCE_DIR}/MarkReadOnlyLoad.cpp"
22+
"${CMAKE_CURRENT_SOURCE_DIR}/RectListOptimizationPass.cpp"
23+
)
24+
25+
set(IGC_BUILD__SRC__Compiler_Optimizer
26+
${IGC_BUILD__SRC__Optimizer}
27+
${IGC_BUILD__SRC__Optimizer_OpenCLPasses}
28+
${IGC_BUILD__SRC__Optimizer_OpenGLPasses}
29+
${IGC_BUILD__SRC__Optimizer_IGCInstCombiner}
30+
PARENT_SCOPE
31+
)
32+
33+
set(IGC_BUILD__HDR__Optimizer
34+
"${CMAKE_CURRENT_SOURCE_DIR}/BuiltInFuncImport.h"
35+
"${CMAKE_CURRENT_SOURCE_DIR}/InfiniteLoopRemoval.hpp"
36+
"${CMAKE_CURRENT_SOURCE_DIR}/LinkMultiRateShaders.hpp"
37+
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIConverter.h"
38+
"${CMAKE_CURRENT_SOURCE_DIR}/OCLBIUtils.h"
39+
"${CMAKE_CURRENT_SOURCE_DIR}/MCSOptimization.hpp"
40+
"${CMAKE_CURRENT_SOURCE_DIR}/GatingSimilarSamples.hpp"
41+
"${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledFuncImport.hpp"
42+
"${CMAKE_CURRENT_SOURCE_DIR}/Scalarizer.h"
43+
"${CMAKE_CURRENT_SOURCE_DIR}/SetMathPrecisionForPositionOutput.hpp"
44+
"${CMAKE_CURRENT_SOURCE_DIR}/FixFastMathFlags.hpp"
45+
"${CMAKE_CURRENT_SOURCE_DIR}/CodeAssumption.hpp"
46+
"${CMAKE_CURRENT_SOURCE_DIR}/RectListOptimizationPass.hpp"
47+
)
48+
49+
50+
set(IGC_BUILD__HDR__Compiler_Optimizer
51+
${IGC_BUILD__HDR__Optimizer}
52+
${IGC_BUILD__HDR__Optimizer_OpenCLPasses}
53+
${IGC_BUILD__HDR__Optimizer_OpenGLPasses}
54+
${IGC_BUILD__HDR__Optimizer_IGCInstCombiner}
55+
PARENT_SCOPE
56+
)
57+
58+
59+
igc_sg_register(
60+
Compiler__Optimizer
61+
"Optimizer"
62+
GROUPS
63+
Compiler__Optimizer_OpenCLPasses
64+
Compiler__Optimizer_OpenGLPasses
65+
Compiler__Optimizer_IGCInstCombiner
66+
FILES
67+
${IGC_BUILD__SRC__Optimizer}
68+
${IGC_BUILD__HDR__Optimizer}
69+
)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
2+
3+
4+
set(IGC_BUILD__SRC__4_0
5+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineAddSub.cpp"
6+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineAndOrXor.cpp"
7+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineCalls.cpp"
8+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineCasts.cpp"
9+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineCompares.cpp"
10+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineLoadStoreAlloca.cpp"
11+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineMulDivRem.cpp"
12+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombinePHI.cpp"
13+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineSelect.cpp"
14+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineShifts.cpp"
15+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineSimplifyDemanded.cpp"
16+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineVectorOps.cpp"
17+
"${CMAKE_CURRENT_SOURCE_DIR}/InstructionCombining.cpp"
18+
)
19+
set(IGC_BUILD__SRC__IGCInstCombiner_4_0 ${IGC_BUILD__SRC__4_0} PARENT_SCOPE)
20+
21+
set(IGC_BUILD__HDR__4_0
22+
"${CMAKE_CURRENT_SOURCE_DIR}/InstCombineInternal.h"
23+
"${CMAKE_CURRENT_SOURCE_DIR}/IGCInstructionCombining.hpp"
24+
)
25+
set(IGC_BUILD__HDR__IGCInstCombiner_4_0 ${IGC_BUILD__HDR__4_0} PARENT_SCOPE)
26+
27+
28+
igc_sg_register(
29+
Optimizer__IGCInstCombiner_4_0
30+
"4.0"
31+
FILES
32+
${IGC_BUILD__SRC__4_0}
33+
${IGC_BUILD__HDR__4_0}
34+
)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*===================== begin_copyright_notice ==================================
2+
3+
Copyright (c) 2017 Intel Corporation
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a
6+
copy of this software and associated documentation files (the
7+
"Software"), to deal in the Software without restriction, including
8+
without limitation the rights to use, copy, modify, merge, publish,
9+
distribute, sublicense, and/or sell copies of the Software, and to
10+
permit persons to whom the Software is furnished to do so, subject to
11+
the following conditions:
12+
13+
The above copyright notice and this permission notice shall be included
14+
in all copies or substantial portions of the Software.
15+
16+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
24+
25+
======================= end_copyright_notice ==================================*/
26+
#ifndef IGC_INSTCOMBINE_INSTCOMBINE_H
27+
#define IGC_INSTCOMBINE_INSTCOMBINE_H
28+
29+
#include <llvm/PassRegistry.h>
30+
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
31+
#include "llvm/IR/PassManager.h"
32+
33+
#include "Compiler/InitializePasses.h"
34+
35+
namespace llvm {
36+
class FunctionPass;
37+
}
38+
39+
namespace IGC
40+
{
41+
class IGCInstructionCombiningPass : public llvm::FunctionPass {
42+
llvm::InstCombineWorklist Worklist;
43+
const bool ExpensiveCombines;
44+
45+
public:
46+
static char ID; // Pass identification, replacement for typeid
47+
48+
IGCInstructionCombiningPass(bool ExpensiveCombines = true)
49+
: FunctionPass(ID), ExpensiveCombines(ExpensiveCombines) {
50+
initializeIGCInstructionCombiningPassPass(*llvm::PassRegistry::getPassRegistry());
51+
}
52+
53+
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
54+
bool runOnFunction(llvm::Function &F) override;
55+
};
56+
57+
58+
llvm::FunctionPass* createIGCInstructionCombiningPass();
59+
} // namespace IGC
60+
61+
#endif //IGC_INSTCOMBINE_INSTCOMBINE_H
62+

0 commit comments

Comments
 (0)