1 ; RUN: opt < %s -gvn-hoist -S | FileCheck %s 2 3 @g = external constant i8* 4 5 declare i32 @gxx_personality(...) 6 declare void @f0() 7 declare void @f1() 8 declare void @f2() 9 10 ; Make sure opt won't crash and that the load 11 ; is not hoisted from label6 to label4 12 13 ;CHECK-LABEL: @func 14 15 define void @func() personality i8* bitcast (i32 (...)* @gxx_personality to i8*) { 16 invoke void @f0() 17 to label %3 unwind label %1 18 19 ; <label>:1: 20 %2 = landingpad { i8*, i32 } 21 catch i8* bitcast (i8** @g to i8*) 22 catch i8* null 23 br label %16 24 25 ; <label>:3: 26 br i1 undef, label %4, label %10 27 28 ;CHECK: <label>:4 29 ;CHECK-NEXT: %5 = load i32*, i32** undef, align 8 30 ;CHECK-NEXT: invoke void @f1() 31 32 ; <label>:4: 33 %5 = load i32*, i32** undef, align 8 34 invoke void @f1() 35 to label %6 unwind label %1 36 37 ;CHECK: <label>:6 38 ;CHECK-NEXT: %7 = load i32*, i32** undef, align 8 39 ;CHECK-NEXT: %8 = load i32*, i32** undef, align 8 40 41 ; <label>:6: 42 %7 = load i32*, i32** undef, align 8 43 %8 = load i32*, i32** undef, align 8 44 br i1 true, label %9, label %17 45 46 ; <label>:9: 47 invoke void @f0() 48 to label %10 unwind label %1 49 50 ; <label>:10: 51 invoke void @f2() 52 to label %11 unwind label %1 53 54 ; <label>:11: 55 %12 = invoke signext i32 undef(i32* null, i32 signext undef, i1 zeroext undef) 56 to label %13 unwind label %14 57 58 ; <label>:13: 59 unreachable 60 61 ; <label>:14: 62 %15 = landingpad { i8*, i32 } 63 catch i8* bitcast (i8** @g to i8*) 64 catch i8* null 65 br label %16 66 67 ; <label>:16: 68 unreachable 69 70 ; <label>:17: 71 ret void 72 73 ; uselistorder directives 74 uselistorder void ()* @f0, { 1, 0 } 75 uselistorder label %1, { 0, 3, 1, 2 } 76 } 77