1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -basic-aa -dse -S | FileCheck %s 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4 5declare void @f() 6declare i32 @__CxxFrameHandler3(...) 7 8 9; Make sure we do not eliminate `store i32 20, i32* %sv`. Even though it is a store 10; to a stack object, we can read it in the landing/catchpad. 11define void @test12(i32* %p) personality i32 (...)* @__CxxFrameHandler3 { 12; CHECK-LABEL: @test12( 13; CHECK-NEXT: block1: 14; CHECK-NEXT: [[SV:%.*]] = alloca i32 15; CHECK-NEXT: br label [[BLOCK2:%.*]] 16; CHECK: block2: 17; CHECK-NEXT: store i32 20, i32* [[SV]] 18; CHECK-NEXT: invoke void @f() 19; CHECK-NEXT: to label [[BLOCK3:%.*]] unwind label [[CATCH_DISPATCH:%.*]] 20; CHECK: block3: 21; CHECK-NEXT: br label [[EXIT:%.*]] 22; CHECK: catch.dispatch: 23; CHECK-NEXT: [[CS1:%.*]] = catchswitch within none [label %catch] unwind label [[CLEANUP:%.*]] 24; CHECK: catch: 25; CHECK-NEXT: [[C:%.*]] = catchpad within [[CS1]] [] 26; CHECK-NEXT: [[LV:%.*]] = load i32, i32* [[SV]] 27; CHECK-NEXT: br label [[EXIT]] 28; CHECK: cleanup: 29; CHECK-NEXT: [[C1:%.*]] = cleanuppad within none [] 30; CHECK-NEXT: br label [[EXIT]] 31; CHECK: exit: 32; CHECK-NEXT: ret void 33; 34block1: 35 %sv = alloca i32 36 br label %block2 37 38block2: 39 store i32 20, i32* %sv 40 invoke void @f() 41 to label %block3 unwind label %catch.dispatch 42 43block3: 44 store i32 30, i32* %sv 45 br label %exit 46 47catch.dispatch: 48 %cs1 = catchswitch within none [label %catch] unwind label %cleanup 49 50catch: 51 %c = catchpad within %cs1 [] 52 %lv = load i32, i32* %sv 53 br label %exit 54 55cleanup: 56 %c1 = cleanuppad within none [] 57 br label %exit 58 59exit: 60 store i32 40, i32* %sv 61 ret void 62} 63