| ; RUN: opt < %s -passes=simplifycfg -S | FileCheck %s |
| |
| target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" |
| target triple = "wasm32-unknown-unknown" |
| |
| ; This is a regression test for a bug in which we used phis() without |
| ; make_early_inc_range() in a for loop while deleting phi nodes. |
| |
| define void @cleanup_phis() personality ptr @__gxx_wasm_personality_v0 { |
| bb0: |
| invoke void @foo() |
| to label %bb1 unwind label %ehcleanup |
| |
| bb1: ; preds = %bb0 |
| invoke void @foo() |
| to label %invoke.cont unwind label %ehcleanup |
| |
| invoke.cont: ; preds = %bb1 |
| ret void |
| |
| ehcleanup: ; preds = %bb1, %bb0 |
| %phi0 = phi i32 [ 0, %bb0 ], [ 1, %bb1 ] |
| %phi1 = phi i32 [ 2, %bb0 ], [ 3, %bb1 ] |
| %0 = cleanuppad within none [] |
| cleanupret from %0 unwind label %catchswitch |
| |
| ; These two phi nodes were originally in ehcleanup. Both phi nodes should be |
| ; correctly copied to this catchswitch BB. |
| ; CHECK: catchswitch: |
| ; CHECK-NEXT: %phi0 = phi i32 [ 0, %bb0 ], [ 1, %bb1 ] |
| ; CHECK-NEXT: %phi1 = phi i32 [ 2, %bb0 ], [ 3, %bb1 ] |
| catchswitch: ; preds = %ehcleanup |
| %1 = catchswitch within none [label %catch] unwind to caller |
| |
| catch: ; preds = %catchswitch |
| %2 = catchpad within %1 [ptr null] |
| call void @bar(i32 %phi0, i32 %phi1) |
| unreachable |
| } |
| |
| declare void @foo() |
| declare void @bar(i32, i32) |
| declare i32 @__gxx_wasm_personality_v0(...) |