@@ -250,62 +250,51 @@ void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, const SCEV *PtrExpr,
250
250
NeedsFreeze);
251
251
}
252
252
253
- void RuntimePointerChecking::tryToCreateDiffCheck (
253
+ bool RuntimePointerChecking::tryToCreateDiffCheck (
254
254
const RuntimeCheckingPtrGroup &CGI, const RuntimeCheckingPtrGroup &CGJ) {
255
- if (!CanUseDiffCheck)
256
- return ;
257
-
258
255
// If either group contains multiple different pointers, bail out.
259
256
// TODO: Support multiple pointers by using the minimum or maximum pointer,
260
257
// depending on src & sink.
261
- if (CGI.Members .size () != 1 || CGJ.Members .size () != 1 ) {
262
- CanUseDiffCheck = false ;
263
- return ;
264
- }
258
+ if (CGI.Members .size () != 1 || CGJ.Members .size () != 1 )
259
+ return false ;
265
260
266
261
PointerInfo *Src = &Pointers[CGI.Members [0 ]];
267
262
PointerInfo *Sink = &Pointers[CGJ.Members [0 ]];
268
263
269
264
// If either pointer is read and written, multiple checks may be needed. Bail
270
265
// out.
271
266
if (!DC.getOrderForAccess (Src->PointerValue , !Src->IsWritePtr ).empty () ||
272
- !DC.getOrderForAccess (Sink->PointerValue , !Sink->IsWritePtr ).empty ()) {
273
- CanUseDiffCheck = false ;
274
- return ;
275
- }
267
+ !DC.getOrderForAccess (Sink->PointerValue , !Sink->IsWritePtr ).empty ())
268
+ return false ;
276
269
277
270
ArrayRef<unsigned > AccSrc =
278
271
DC.getOrderForAccess (Src->PointerValue , Src->IsWritePtr );
279
272
ArrayRef<unsigned > AccSink =
280
273
DC.getOrderForAccess (Sink->PointerValue , Sink->IsWritePtr );
281
274
// If either pointer is accessed multiple times, there may not be a clear
282
275
// src/sink relation. Bail out for now.
283
- if (AccSrc.size () != 1 || AccSink.size () != 1 ) {
284
- CanUseDiffCheck = false ;
285
- return ;
286
- }
276
+ if (AccSrc.size () != 1 || AccSink.size () != 1 )
277
+ return false ;
278
+
287
279
// If the sink is accessed before src, swap src/sink.
288
280
if (AccSink[0 ] < AccSrc[0 ])
289
281
std::swap (Src, Sink);
290
282
291
283
auto *SrcAR = dyn_cast<SCEVAddRecExpr>(Src->Expr );
292
284
auto *SinkAR = dyn_cast<SCEVAddRecExpr>(Sink->Expr );
293
285
if (!SrcAR || !SinkAR || SrcAR->getLoop () != DC.getInnermostLoop () ||
294
- SinkAR->getLoop () != DC.getInnermostLoop ()) {
295
- CanUseDiffCheck = false ;
296
- return ;
297
- }
286
+ SinkAR->getLoop () != DC.getInnermostLoop ())
287
+ return false ;
298
288
299
289
SmallVector<Instruction *, 4 > SrcInsts =
300
290
DC.getInstructionsForAccess (Src->PointerValue , Src->IsWritePtr );
301
291
SmallVector<Instruction *, 4 > SinkInsts =
302
292
DC.getInstructionsForAccess (Sink->PointerValue , Sink->IsWritePtr );
303
293
Type *SrcTy = getLoadStoreType (SrcInsts[0 ]);
304
294
Type *DstTy = getLoadStoreType (SinkInsts[0 ]);
305
- if (isa<ScalableVectorType>(SrcTy) || isa<ScalableVectorType>(DstTy)) {
306
- CanUseDiffCheck = false ;
307
- return ;
308
- }
295
+ if (isa<ScalableVectorType>(SrcTy) || isa<ScalableVectorType>(DstTy))
296
+ return false ;
297
+
309
298
const DataLayout &DL =
310
299
SinkAR->getLoop ()->getHeader ()->getModule ()->getDataLayout ();
311
300
unsigned AllocSize =
@@ -316,10 +305,8 @@ void RuntimePointerChecking::tryToCreateDiffCheck(
316
305
// future.
317
306
auto *Step = dyn_cast<SCEVConstant>(SinkAR->getStepRecurrence (*SE));
318
307
if (!Step || Step != SrcAR->getStepRecurrence (*SE) ||
319
- Step->getAPInt ().abs () != AllocSize) {
320
- CanUseDiffCheck = false ;
321
- return ;
322
- }
308
+ Step->getAPInt ().abs () != AllocSize)
309
+ return false ;
323
310
324
311
IntegerType *IntTy =
325
312
IntegerType::get (Src->PointerValue ->getContext (),
@@ -332,10 +319,8 @@ void RuntimePointerChecking::tryToCreateDiffCheck(
332
319
const SCEV *SinkStartInt = SE->getPtrToIntExpr (SinkAR->getStart (), IntTy);
333
320
const SCEV *SrcStartInt = SE->getPtrToIntExpr (SrcAR->getStart (), IntTy);
334
321
if (isa<SCEVCouldNotCompute>(SinkStartInt) ||
335
- isa<SCEVCouldNotCompute>(SrcStartInt)) {
336
- CanUseDiffCheck = false ;
337
- return ;
338
- }
322
+ isa<SCEVCouldNotCompute>(SrcStartInt))
323
+ return false ;
339
324
340
325
const Loop *InnerLoop = SrcAR->getLoop ();
341
326
// If the start values for both Src and Sink also vary according to an outer
@@ -356,8 +341,7 @@ void RuntimePointerChecking::tryToCreateDiffCheck(
356
341
SinkStartAR->getStepRecurrence (*SE)) {
357
342
LLVM_DEBUG (dbgs () << " LAA: Not creating diff runtime check, since these "
358
343
" cannot be hoisted out of the outer loop\n " );
359
- CanUseDiffCheck = false ;
360
- return ;
344
+ return false ;
361
345
}
362
346
}
363
347
@@ -366,6 +350,7 @@ void RuntimePointerChecking::tryToCreateDiffCheck(
366
350
<< " SinkStartInt: " << *SinkStartInt << ' \n ' );
367
351
DiffChecks.emplace_back (SrcStartInt, SinkStartInt, AllocSize,
368
352
Src->NeedsFreeze || Sink->NeedsFreeze );
353
+ return true ;
369
354
}
370
355
371
356
SmallVector<RuntimePointerCheck, 4 > RuntimePointerChecking::generateChecks () {
@@ -377,7 +362,7 @@ SmallVector<RuntimePointerCheck, 4> RuntimePointerChecking::generateChecks() {
377
362
const RuntimeCheckingPtrGroup &CGJ = CheckingGroups[J];
378
363
379
364
if (needsChecking (CGI, CGJ)) {
380
- tryToCreateDiffCheck (CGI, CGJ);
365
+ CanUseDiffCheck = CanUseDiffCheck && tryToCreateDiffCheck (CGI, CGJ);
381
366
Checks.push_back (std::make_pair (&CGI, &CGJ));
382
367
}
383
368
}
0 commit comments