summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp9
-rw-r--r--polly/test/Isl/CodeGen/invariant_cannot_handle_void.ll60
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"}
OpenPOWER on IntegriCloud