|
@@ -22,7 +22,7 @@ static MDNode *createMetadata(LLVMContext &Ctx, const LoopAttributes &Attrs) {
|
|
|
|
|
|
if (!Attrs.IsParallel && Attrs.VectorizerWidth == 0 &&
|
|
if (!Attrs.IsParallel && Attrs.VectorizerWidth == 0 &&
|
|
Attrs.VectorizerUnroll == 0 &&
|
|
Attrs.VectorizerUnroll == 0 &&
|
|
- Attrs.HlslLoop == false && // HLSL Change
|
|
|
|
|
|
+ Attrs.HlslUnrollPolicy == LoopAttributes::HlslAllowUnroll && // HLSL Change
|
|
Attrs.HlslUnrollCount == 0 && // HLSL Change
|
|
Attrs.HlslUnrollCount == 0 && // HLSL Change
|
|
Attrs.VectorizerEnable == LoopAttributes::VecUnspecified)
|
|
Attrs.VectorizerEnable == LoopAttributes::VecUnspecified)
|
|
return nullptr;
|
|
return nullptr;
|
|
@@ -59,15 +59,15 @@ static MDNode *createMetadata(LLVMContext &Ctx, const LoopAttributes &Attrs) {
|
|
}
|
|
}
|
|
|
|
|
|
// HLSL Change Begins.
|
|
// HLSL Change Begins.
|
|
- if (Attrs.HlslLoop) {
|
|
|
|
|
|
+ if (Attrs.HlslUnrollPolicy == LoopAttributes::HlslDisableUnroll) {
|
|
// Disable unroll.
|
|
// Disable unroll.
|
|
SmallVector<Metadata *, 1> DisableOperands;
|
|
SmallVector<Metadata *, 1> DisableOperands;
|
|
DisableOperands.push_back(MDString::get(Ctx, "llvm.loop.unroll.disable"));
|
|
DisableOperands.push_back(MDString::get(Ctx, "llvm.loop.unroll.disable"));
|
|
MDNode *DisableNode = MDNode::get(Ctx, DisableOperands);
|
|
MDNode *DisableNode = MDNode::get(Ctx, DisableOperands);
|
|
Args.push_back(DisableNode);
|
|
Args.push_back(DisableNode);
|
|
}
|
|
}
|
|
- else if (Attrs.HlslUnrollCount) {
|
|
|
|
- if (Attrs.HlslUnrollCount == 1) {
|
|
|
|
|
|
+ else if (Attrs.HlslUnrollPolicy == LoopAttributes::HlslForceUnroll) {
|
|
|
|
+ if (Attrs.HlslUnrollCount == 0) {
|
|
// Full unroll.
|
|
// Full unroll.
|
|
SmallVector<Metadata *, 1> FullOperands;
|
|
SmallVector<Metadata *, 1> FullOperands;
|
|
FullOperands.push_back(MDString::get(Ctx, "llvm.loop.unroll.full"));
|
|
FullOperands.push_back(MDString::get(Ctx, "llvm.loop.unroll.full"));
|
|
@@ -91,14 +91,14 @@ static MDNode *createMetadata(LLVMContext &Ctx, const LoopAttributes &Attrs) {
|
|
LoopAttributes::LoopAttributes(bool IsParallel)
|
|
LoopAttributes::LoopAttributes(bool IsParallel)
|
|
: IsParallel(IsParallel), VectorizerEnable(LoopAttributes::VecUnspecified),
|
|
: IsParallel(IsParallel), VectorizerEnable(LoopAttributes::VecUnspecified),
|
|
VectorizerWidth(0), VectorizerUnroll(0),
|
|
VectorizerWidth(0), VectorizerUnroll(0),
|
|
- HlslLoop(false), HlslUnrollCount(0) {} // HLSL Change
|
|
|
|
|
|
+ HlslUnrollPolicy(LoopAttributes::HlslAllowUnroll), HlslUnrollCount(0) {} // HLSL Change
|
|
|
|
|
|
void LoopAttributes::clear() {
|
|
void LoopAttributes::clear() {
|
|
IsParallel = false;
|
|
IsParallel = false;
|
|
VectorizerWidth = 0;
|
|
VectorizerWidth = 0;
|
|
VectorizerUnroll = 0;
|
|
VectorizerUnroll = 0;
|
|
VectorizerEnable = LoopAttributes::VecUnspecified;
|
|
VectorizerEnable = LoopAttributes::VecUnspecified;
|
|
- HlslLoop = false; // HLSL Change
|
|
|
|
|
|
+ HlslUnrollPolicy = LoopAttributes::HlslAllowUnroll; // HLSL Change
|
|
HlslUnrollCount = 0; // HLSL Change
|
|
HlslUnrollCount = 0; // HLSL Change
|
|
}
|
|
}
|
|
|
|
|
|
@@ -113,11 +113,11 @@ void LoopInfoStack::push(BasicBlock *Header,
|
|
const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(Attr);
|
|
const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(Attr);
|
|
// HLSL Change Begins
|
|
// HLSL Change Begins
|
|
if (dyn_cast<HLSLLoopAttr>(Attr)) {
|
|
if (dyn_cast<HLSLLoopAttr>(Attr)) {
|
|
- setHlslLoop(true);
|
|
|
|
|
|
+ setHlslLoop();
|
|
} else if (const HLSLUnrollAttr *UnrollAttr =
|
|
} else if (const HLSLUnrollAttr *UnrollAttr =
|
|
dyn_cast<HLSLUnrollAttr>(Attr)) {
|
|
dyn_cast<HLSLUnrollAttr>(Attr)) {
|
|
unsigned count = UnrollAttr->getCount();
|
|
unsigned count = UnrollAttr->getCount();
|
|
- setHlslUnrollCount(count);
|
|
|
|
|
|
+ setHlslUnroll(count);
|
|
}
|
|
}
|
|
// HLSL Change Ends
|
|
// HLSL Change Ends
|
|
// Skip non loop hint attributes
|
|
// Skip non loop hint attributes
|