Skip to content

Commit

Permalink
[AlignFromAssume] Bailout w/non-constant alignments (pr51680)
Browse files Browse the repository at this point in the history
This is a bailout for pr51680.  This pass appears to assume that the alignment operand to an align tag on an assume bundle is constant.  This doesn't appear to be required anywhere, and clang happily generates non-constant alignments for cases such as this case taken from the bug report:

// clang -cc1 -triple powerpc64-- -S -O1 opal_pci-min.c
extern int a[];
long *b;
long c;
void *d(long, int *, int, long, long, long) __attribute__((__alloc_align__(6)));
void e() {
  b = d(c, a, 0, 0, 5, c);
  b[0] = 0;
}

This was exposed by a SCEV change which allowed a non-constant alignment to reach further into the pass' code.  We could generalize the pass, but for now, let's fix the crash.

(cherry picked from commit 9b45fd9)
  • Loading branch information
preames authored and tstellar committed Sep 2, 2021
1 parent d597db1 commit 703ee97
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ bool AlignmentFromAssumptionsPass::extractAlignmentInfo(CallInst *I,
AAPtr = AAPtr->stripPointerCastsSameRepresentation();
AlignSCEV = SE->getSCEV(AlignOB.Inputs[1].get());
AlignSCEV = SE->getTruncateOrZeroExtend(AlignSCEV, Int64Ty);
if (!isa<SCEVConstant>(AlignSCEV))
// Added to suppress a crash because consumer doesn't expect non-constant
// alignments in the assume bundle. TODO: Consider generalizing caller.
return false;
if (AlignOB.Inputs.size() == 3)
OffSCEV = SE->getSCEV(AlignOB.Inputs[2].get());
else
Expand Down
13 changes: 13 additions & 0 deletions llvm/test/Transforms/AlignmentFromAssumptions/simple.ll
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,19 @@ entry:
; CHECK: ret i32 undef
}


; Variable alignments appear to be legal, don't crash
define i32 @pr51680(i32* nocapture %a, i32 %align) nounwind uwtable readonly {
entry:
tail call void @llvm.assume(i1 true) ["align"(i32* %a, i32 %align)]
%0 = load i32, i32* %a, align 4
ret i32 %0

; CHECK-LABEL: @pr51680
; CHECK: load i32, i32* {{[^,]+}}, align 4
; CHECK: ret i32
}

declare void @llvm.assume(i1) nounwind

declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
Expand Down

0 comments on commit 703ee97

Please sign in to comment.