| ; 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 |
| } |
| |