blob: 39c2cf01455a3b5ea2c2aa5dd7183659c7ff228f [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt --passes=sroa -S < %s | FileCheck %s
; Ensure no crash when a store's value operand is the load being promoted,
; creating a self-referential cycle in unreachable code.
define i32 @func(i64 %iv) {
; CHECK-LABEL: define i32 @func(
; CHECK-SAME: i64 [[IV:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[A:%.*]] = alloca [2 x i32], align 4
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: br label %[[LOOP]]
; CHECK: [[EXIT:.*]]:
; CHECK-NEXT: store i32 poison, ptr [[A]], align 4
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[DEAD:.*]]:
; CHECK-NEXT: br label %[[DEAD]]
; CHECK: [[USE:.*]]:
; CHECK-NEXT: [[GEP:%.*]] = getelementptr [4 x i8], ptr [[A]], i64 [[IV]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: br i1 false, label %[[USE]], label %[[DEAD]]
;
entry:
%a = alloca [2 x i32], align 4
br label %loop
loop:
br label %loop
exit:
store i32 %0, ptr %a, align 4
%0 = load i32, ptr %a, align 4
br label %exit
dead:
br label %dead
use:
%gep = getelementptr [4 x i8], ptr %a, i64 %iv
%1 = load i32, ptr %gep, align 4
br i1 false, label %use, label %dead
}