diff options
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 9 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/invariant_cannot_handle_void.ll | 60 |
2 files changed, 69 insertions, 0 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 006ea878888..ab5469634e9 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -2564,6 +2564,15 @@ void Scop::hoistInvariantLoads() { continue; isl_map *AccessRelation = MA->getAccessRelation(); + + // Skip accesses that have an empty access relation. These can be caused + // by multiple offsets with a type cast in-between that cause the overall + // byte offset to be not divisible by the new types sizes. + if (isl_map_is_empty(AccessRelation)) { + isl_map_free(AccessRelation); + continue; + } + if (isl_map_involves_dims(AccessRelation, isl_dim_in, 0, Stmt.getNumIterators())) { isl_map_free(AccessRelation); diff --git a/polly/test/Isl/CodeGen/invariant_cannot_handle_void.ll b/polly/test/Isl/CodeGen/invariant_cannot_handle_void.ll new file mode 100644 index 00000000000..5497b31d26d --- /dev/null +++ b/polly/test/Isl/CodeGen/invariant_cannot_handle_void.ll @@ -0,0 +1,60 @@ +; RUN: opt %loadPolly -S -polly-codegen %s | FileCheck %s +; +; The offset of the %tmp1 load wrt. to %buff (62 bytes) is not divisible +; by the type size (i32 = 4 bytes), thus the access function build for +; %tmp1 is empty. As a result the code generation crashed when hoisting +; %tmp1. This test verifies we do not crash anymore. +; +; CHECK: polly.start +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +; Function Attrs: nounwind uwtable +define void @sudecrypt(i8* %buff) #0 { +entry: + br i1 undef, label %cleanup, label %if.end + +if.end: ; preds = %entry + br i1 undef, label %if.end.6, label %if.then.5 + +if.then.5: ; preds = %if.end + unreachable + +if.end.6: ; preds = %if.end + %add.ptr = getelementptr inbounds i8, i8* %buff, i64 62 + %tmp = bitcast i8* %add.ptr to i32* + %tmp1 = load i32, i32* %tmp, align 4, !tbaa !1 + br i1 false, label %if.then.13, label %switch.early.test + +switch.early.test: ; preds = %if.end.6 + switch i32 0, label %if.end.16 [ + i32 956, label %if.then.13 + i32 520, label %if.then.13 + ] + +if.then.13: ; preds = %switch.early.test, %switch.early.test, %if.end.6 + br label %if.end.16 + +if.end.16: ; preds = %if.then.13, %switch.early.test + %key.0 = phi i32 [ undef, %if.then.13 ], [ 0, %switch.early.test ] + br i1 undef, label %if.end.34, label %if.then.19 + +if.then.19: ; preds = %if.end.16 + unreachable + +if.end.34: ; preds = %if.end.16 + unreachable + +cleanup: ; preds = %entry + ret void +} + +attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.ident = !{!0} + +!0 = !{!"clang version 3.8.0 (trunk 250010) (llvm/trunk 250018)"} +!1 = !{!2, !2, i64 0} +!2 = !{!"int", !3, i64 0} +!3 = !{!"omnipotent char", !4, i64 0} +!4 = !{!"Simple C/C++ TBAA"} |