From fb42ed29256c51852f80cebb0af2f86dba34e814 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Wed, 10 Sep 2014 21:05:52 +0000 Subject: [PATCH] [AlignmentFromAssumptions] Don't divide by zero for unknown starting alignment The routine that determines an alignment given some SCEV returns zero if the answer is unknown. In a case where we could determine the increment of an AddRec but not the starting alignment, we would compute the integer modulus by zero (which is illegal and traps). Prevent this by returning early if either the start or increment alignment is unknown (zero). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217544 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/AlignmentFromAssumptions.cpp | 6 +- .../AlignmentFromAssumptions/start-unk.ll | 154 ++++++++++++++++++ 2 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/AlignmentFromAssumptions/start-unk.ll diff --git a/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp b/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp index a662accf69f..7ab16f13811 100644 --- a/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp +++ b/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp @@ -179,7 +179,9 @@ static unsigned getNewAlignment(const SCEV *AASCEV, const SCEV *AlignSCEV, DEBUG(dbgs() << "\tnew start alignment: " << NewAlignment << "\n"); DEBUG(dbgs() << "\tnew inc alignment: " << NewIncAlignment << "\n"); - if (NewAlignment > NewIncAlignment) { + if (!NewAlignment || !NewIncAlignment) { + return 0; + } else if (NewAlignment > NewIncAlignment) { if (NewAlignment % NewIncAlignment == 0) { DEBUG(dbgs() << "\tnew start/inc alignment: " << NewIncAlignment << "\n"); @@ -191,7 +193,7 @@ static unsigned getNewAlignment(const SCEV *AASCEV, const SCEV *AlignSCEV, NewAlignment << "\n"); return NewAlignment; } - } else if (NewIncAlignment == NewAlignment && NewIncAlignment) { + } else if (NewIncAlignment == NewAlignment) { DEBUG(dbgs() << "\tnew start/inc alignment: " << NewAlignment << "\n"); return NewAlignment; diff --git a/test/Transforms/AlignmentFromAssumptions/start-unk.ll b/test/Transforms/AlignmentFromAssumptions/start-unk.ll new file mode 100644 index 00000000000..b7fe24947cb --- /dev/null +++ b/test/Transforms/AlignmentFromAssumptions/start-unk.ll @@ -0,0 +1,154 @@ +; RUN: opt -alignment-from-assumptions -S < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%type1 = type { %type2 } +%type2 = type { [4 x i8] } + +; Function Attrs: nounwind +declare void @llvm.assume(i1) #0 + +; Function Attrs: nounwind readnone +declare i32 @llvm.bswap.i32(i32) #1 + +; Function Attrs: nounwind uwtable +define void @test1() unnamed_addr #2 align 2 { + +; CHECK-LABEL: @test1 + +entry: + br i1 undef, label %if.then, label %if.end + +if.then: ; preds = %entry + unreachable + +if.end: ; preds = %entry + br i1 undef, label %return, label %if.end8 + +if.end8: ; preds = %if.end + br i1 undef, label %if.then13, label %if.end14 + +if.then13: ; preds = %if.end8 + unreachable + +if.end14: ; preds = %if.end8 + br i1 undef, label %cond.false.i129, label %cond.end.i136 + +cond.false.i129: ; preds = %if.end14 + unreachable + +cond.end.i136: ; preds = %if.end14 + br i1 undef, label %land.lhs.true.i, label %if.end.i145 + +land.lhs.true.i: ; preds = %cond.end.i136 + br i1 undef, label %if.end.i145, label %if.then.i137 + +if.then.i137: ; preds = %land.lhs.true.i + br i1 undef, label %cond.false8.i, label %cond.end9.i + +cond.false8.i: ; preds = %if.then.i137 + unreachable + +cond.end9.i: ; preds = %if.then.i137 + br i1 undef, label %if.then23, label %if.end24 + +if.end.i145: ; preds = %land.lhs.true.i, %cond.end.i136 + unreachable + +if.then23: ; preds = %cond.end9.i + unreachable + +if.end24: ; preds = %cond.end9.i + br i1 undef, label %for.end, label %for.body.lr.ph + +for.body.lr.ph: ; preds = %if.end24 + unreachable + +for.end: ; preds = %if.end24 + br i1 undef, label %if.end123, label %if.then121 + +if.then121: ; preds = %for.end + unreachable + +if.end123: ; preds = %for.end + br i1 undef, label %if.end150, label %if.then126 + +if.then126: ; preds = %if.end123 + %ptrint.i.i185 = ptrtoint %type1* undef to i64 + %maskedptr.i.i186 = and i64 %ptrint.i.i185, 1 + %maskcond.i.i187 = icmp eq i64 %maskedptr.i.i186, 0 + tail call void @llvm.assume(i1 %maskcond.i.i187) #0 + %ret.0..sroa_cast.i.i188 = bitcast %type1* undef to i32* + %ret.0.copyload.i.i189 = load i32* %ret.0..sroa_cast.i.i188, align 2 + +; CHECK: load {{.*}} align 2 + + %0 = tail call i32 @llvm.bswap.i32(i32 %ret.0.copyload.i.i189) #0 + %conv131 = zext i32 %0 to i64 + %add.ptr132 = getelementptr inbounds i8* undef, i64 %conv131 + %1 = bitcast i8* %add.ptr132 to %type1* + br i1 undef, label %if.end150, label %if.end.i173 + +if.end.i173: ; preds = %if.then126 + br i1 undef, label %test1.exit, label %cond.false.i.i.i.i174 + +cond.false.i.i.i.i174: ; preds = %if.end.i173 + unreachable + +test1.exit: ; preds = %if.end.i173 + br i1 undef, label %test1a.exit, label %if.end.i124 + +if.end.i124: ; preds = %test1.exit + unreachable + +test1a.exit: ; preds = %test1.exit + br i1 undef, label %if.end150, label %for.body137.lr.ph + +for.body137.lr.ph: ; preds = %test1a.exit + br label %for.body137 + +for.body137: ; preds = %test1b.exit, %for.body137.lr.ph + %ShndxTable.0309 = phi %type1* [ %1, %for.body137.lr.ph ], [ %incdec.ptr, %test1b.exit ] + %ret.0..sroa_cast.i.i106 = bitcast %type1* %ShndxTable.0309 to i32* + br i1 undef, label %for.body137.if.end146_crit_edge, label %if.then140 + +for.body137.if.end146_crit_edge: ; preds = %for.body137 + %incdec.ptr = getelementptr inbounds %type1* %ShndxTable.0309, i64 1 + br i1 undef, label %cond.false.i70, label %cond.end.i + +if.then140: ; preds = %for.body137 + %ret.0.copyload.i.i102 = load i32* %ret.0..sroa_cast.i.i106, align 2 + +; CHECK: load {{.*}} align 2 + + unreachable + +cond.false.i70: ; preds = %for.body137.if.end146_crit_edge + unreachable + +cond.end.i: ; preds = %for.body137.if.end146_crit_edge + br i1 undef, label %test1b.exit, label %cond.false.i.i + +cond.false.i.i: ; preds = %cond.end.i + unreachable + +test1b.exit: ; preds = %cond.end.i + br i1 undef, label %if.end150, label %for.body137 + +if.end150: ; preds = %test1b.exit, %test1a.exit, %if.then126, %if.end123 + br i1 undef, label %for.end176, label %for.body155.lr.ph + +for.body155.lr.ph: ; preds = %if.end150 + unreachable + +for.end176: ; preds = %if.end150 + unreachable + +return: ; preds = %if.end + ret void +} + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind uwtable } + -- 2.34.1