| ; RUN: llc -march=hexagon < %s |
| ; REQUIRES: asserts |
| |
| ; The two loads based on %struct.0, loading two different data types |
| ; cause LSR to assume type "void" for the memory type. This would then |
| ; cause an assert in isLegalAddressingMode. Make sure we no longer crash. |
| |
| target triple = "hexagon" |
| |
| %struct.0 = type { i8*, i8, %union.anon.0 } |
| %union.anon.0 = type { i8* } |
| |
| define hidden fastcc void @fred() unnamed_addr #0 { |
| entry: |
| br i1 undef, label %while.end, label %while.body.lr.ph |
| |
| while.body.lr.ph: ; preds = %entry |
| br label %while.body |
| |
| while.body: ; preds = %exit.2, %while.body.lr.ph |
| %lsr.iv = phi %struct.0* [ %cgep22, %exit.2 ], [ undef, %while.body.lr.ph ] |
| switch i32 undef, label %exit [ |
| i32 1, label %sw.bb.i |
| i32 2, label %sw.bb3.i |
| ] |
| |
| sw.bb.i: ; preds = %while.body |
| unreachable |
| |
| sw.bb3.i: ; preds = %while.body |
| unreachable |
| |
| exit: ; preds = %while.body |
| switch i32 undef, label %exit.2 [ |
| i32 1, label %sw.bb.i17 |
| i32 2, label %sw.bb3.i20 |
| ] |
| |
| sw.bb.i17: ; preds = %.exit |
| %0 = bitcast %struct.0* %lsr.iv to i32* |
| %1 = load i32, i32* %0, align 4 |
| unreachable |
| |
| sw.bb3.i20: ; preds = %exit |
| %2 = bitcast %struct.0* %lsr.iv to i8** |
| %3 = load i8*, i8** %2, align 4 |
| unreachable |
| |
| exit.2: ; preds = %exit |
| %cgep22 = getelementptr %struct.0, %struct.0* %lsr.iv, i32 1 |
| br label %while.body |
| |
| while.end: ; preds = %entry |
| ret void |
| } |
| |
| attributes #0 = { nounwind optsize "target-cpu"="hexagonv55" } |
| |