1eb6c6e60SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2acdc419cSBjorn Pettersson; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3eb6c6e60SRoman Lebedev 4eb6c6e60SRoman Lebedev; Check that InstCombine can sink instructions to the landingpad of the invoke. 5eb6c6e60SRoman Lebedev 6*4ab40ecaSBjorn Petterssondefine void @t0_noop(i32 %arg) personality ptr @__gxx_personality_v0 { 7eb6c6e60SRoman Lebedev; CHECK-LABEL: @t0_noop( 8eb6c6e60SRoman Lebedev; CHECK-NEXT: entry: 9eb6c6e60SRoman Lebedev; CHECK-NEXT: [[C:%.*]] = call i1 @cond() 10eb6c6e60SRoman Lebedev; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 11eb6c6e60SRoman Lebedev; CHECK: if.then: 12eb6c6e60SRoman Lebedev; CHECK-NEXT: invoke void @simple_throw() 13eb6c6e60SRoman Lebedev; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] 14eb6c6e60SRoman Lebedev; CHECK: invoke.cont: 15eb6c6e60SRoman Lebedev; CHECK-NEXT: unreachable 16eb6c6e60SRoman Lebedev; CHECK: lpad: 17*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 } 18eb6c6e60SRoman Lebedev; CHECK-NEXT: cleanup 19ba8eb31bSRoman Lebedev; CHECK-NEXT: [[V0:%.*]] = add i32 [[ARG:%.*]], 42 20eb6c6e60SRoman Lebedev; CHECK-NEXT: call void @consume(i32 [[V0]]) 21eb6c6e60SRoman Lebedev; CHECK-NEXT: call void @destructor() 22*4ab40ecaSBjorn Pettersson; CHECK-NEXT: resume { ptr, i32 } [[EH]] 23eb6c6e60SRoman Lebedev; CHECK: if.end: 24eb6c6e60SRoman Lebedev; CHECK-NEXT: [[V1:%.*]] = add i32 [[ARG]], 24 25eb6c6e60SRoman Lebedev; CHECK-NEXT: call void @consume(i32 [[V1]]) 26eb6c6e60SRoman Lebedev; CHECK-NEXT: call void @sideeffect() 27eb6c6e60SRoman Lebedev; CHECK-NEXT: ret void 28eb6c6e60SRoman Lebedev; 29eb6c6e60SRoman Lebedeventry: 30eb6c6e60SRoman Lebedev %c = call i1 @cond() 31eb6c6e60SRoman Lebedev %v0 = add i32 %arg, 42 32eb6c6e60SRoman Lebedev %v1 = add i32 %arg, 24 33eb6c6e60SRoman Lebedev br i1 %c, label %if.then, label %if.end 34eb6c6e60SRoman Lebedev 35eb6c6e60SRoman Lebedevif.then: 36eb6c6e60SRoman Lebedev invoke void @simple_throw() to label %invoke.cont unwind label %lpad 37eb6c6e60SRoman Lebedev 38eb6c6e60SRoman Lebedevinvoke.cont: 39eb6c6e60SRoman Lebedev unreachable 40eb6c6e60SRoman Lebedev 41eb6c6e60SRoman Lebedevlpad: 42*4ab40ecaSBjorn Pettersson %eh = landingpad { ptr, i32 } cleanup 43eb6c6e60SRoman Lebedev call void @consume(i32 %v0) 44eb6c6e60SRoman Lebedev call void @destructor() 45*4ab40ecaSBjorn Pettersson resume { ptr, i32 } %eh 46eb6c6e60SRoman Lebedev 47eb6c6e60SRoman Lebedevif.end: 48eb6c6e60SRoman Lebedev call void @consume(i32 %v1) 49eb6c6e60SRoman Lebedev call void @sideeffect() 50eb6c6e60SRoman Lebedev ret void 51eb6c6e60SRoman Lebedev} 52eb6c6e60SRoman Lebedev 53eb6c6e60SRoman Lebedevdeclare i1 @cond() 54eb6c6e60SRoman Lebedev 55eb6c6e60SRoman Lebedevdeclare void @sideeffect() 56eb6c6e60SRoman Lebedev 57eb6c6e60SRoman Lebedevdeclare void @simple_throw() noreturn 58eb6c6e60SRoman Lebedev 59eb6c6e60SRoman Lebedevdeclare void @destructor() 60eb6c6e60SRoman Lebedev 61eb6c6e60SRoman Lebedevdeclare void @consume(i32) 62eb6c6e60SRoman Lebedev 63eb6c6e60SRoman Lebedevdeclare dso_local i32 @__gxx_personality_v0(...) 64