| ; RUN: opt %loadPolly -polly-scops -analyze < %s |
| ; |
| ; This crased at some point as we place %1 and %4 in the same equivalence class |
| ; for invariant loads and when we remap SCEVs to use %4 instead of %1 AddRec SCEVs |
| ; for the for.body.10 loop caused a crash as their operands were not invariant |
| ; in the loop. While we know they are, ScalarEvolution does not. However, we can simply |
| ; rewrite the AddRecs to hoist everything from the "start" out of the AddRec. |
| ; |
| ; Check we do not crash. |
| target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| |
| %struct.codebook.48.118.748.1882.2972 = type { i64, i64, i64, %struct.static_codebook.19.89.719.1853.2971*, float*, i32*, i32*, i8*, i32*, i32, i32 } |
| %struct.static_codebook.19.89.719.1853.2971 = type { i64, i64, i64*, i32, i64, i64, i32, i32, i64*, %struct.encode_aux_nearestmatch.16.86.716.1850.2968*, %struct.encode_aux_threshmatch.17.87.717.1851.2969*, %struct.encode_aux_pigeonhole.18.88.718.1852.2970*, i32 } |
| %struct.encode_aux_nearestmatch.16.86.716.1850.2968 = type { i64*, i64*, i64*, i64*, i64, i64 } |
| %struct.encode_aux_threshmatch.17.87.717.1851.2969 = type { float*, i64*, i32, i32 } |
| %struct.encode_aux_pigeonhole.18.88.718.1852.2970 = type { float, float, i32, i32, i64*, i64, i64*, i64*, i64* } |
| |
| ; Function Attrs: inlinehint nounwind uwtable |
| declare i64 @decode_packed_entry_number() #0 |
| |
| ; Function Attrs: nounwind uwtable |
| define void @vorbis_book_decodev_set(%struct.codebook.48.118.748.1882.2972* %book) #1 { |
| entry: |
| br i1 undef, label %for.body, label %return |
| |
| for.cond.loopexit: ; preds = %for.body.10, %if.end |
| br i1 undef, label %for.body, label %return |
| |
| for.body: ; preds = %for.cond.loopexit, %entry |
| %call = tail call i64 @decode_packed_entry_number() |
| br i1 undef, label %return, label %if.end |
| |
| if.end: ; preds = %for.body |
| %valuelist = getelementptr inbounds %struct.codebook.48.118.748.1882.2972, %struct.codebook.48.118.748.1882.2972* %book, i64 0, i32 4 |
| %0 = load float*, float** %valuelist, align 8 |
| %sext = shl i64 %call, 32 |
| %conv4 = ashr exact i64 %sext, 32 |
| %dim = getelementptr inbounds %struct.codebook.48.118.748.1882.2972, %struct.codebook.48.118.748.1882.2972* %book, i64 0, i32 0 |
| %1 = load i64, i64* %dim, align 8 |
| %mul = mul nsw i64 %1, %conv4 |
| %add.ptr = getelementptr inbounds float, float* %0, i64 %mul |
| %cmp8.7 = icmp sgt i64 %1, 0 |
| br i1 %cmp8.7, label %for.body.10, label %for.cond.loopexit |
| |
| for.body.10: ; preds = %for.body.10, %if.end |
| %indvars.iv15 = phi i64 [ %indvars.iv.next16, %for.body.10 ], [ 0, %if.end ] |
| %indvars.iv.next16 = add nuw nsw i64 %indvars.iv15, 1 |
| %arrayidx = getelementptr inbounds float, float* %add.ptr, i64 %indvars.iv15 |
| %2 = bitcast float* %arrayidx to i32* |
| %3 = load i32, i32* %2, align 4 |
| %4 = load i64, i64* %dim, align 8 |
| %cmp8 = icmp slt i64 %indvars.iv.next16, %4 |
| br i1 %cmp8, label %for.body.10, label %for.cond.loopexit |
| |
| return: ; preds = %for.body, %for.cond.loopexit, %entry |
| ret void |
| } |