| ; RUN: opt < %s -gvn-hoist -S | FileCheck %s |
| |
| @g = external constant i8* |
| |
| declare i32 @gxx_personality(...) |
| declare void @f0() |
| declare void @f1() |
| declare void @f2() |
| |
| ; Make sure opt won't crash and that the load |
| ; is not hoisted from label6 to label4 |
| |
| ;CHECK-LABEL: @func |
| |
| define void @func() personality i8* bitcast (i32 (...)* @gxx_personality to i8*) { |
| invoke void @f0() |
| to label %3 unwind label %1 |
| |
| 1: |
| %2 = landingpad { i8*, i32 } |
| catch i8* bitcast (i8** @g to i8*) |
| catch i8* null |
| br label %16 |
| |
| 3: |
| br i1 undef, label %4, label %10 |
| |
| ;CHECK: 4: |
| ;CHECK-NEXT: %5 = load i32*, i32** undef, align 8 |
| ;CHECK-NEXT: invoke void @f1() |
| |
| 4: |
| %5 = load i32*, i32** undef, align 8 |
| invoke void @f1() |
| to label %6 unwind label %1 |
| |
| ;CHECK: 6: |
| ;CHECK-NEXT: %7 = load i32*, i32** undef, align 8 |
| ;CHECK-NEXT: %8 = load i32*, i32** undef, align 8 |
| |
| 6: |
| %7 = load i32*, i32** undef, align 8 |
| %8 = load i32*, i32** undef, align 8 |
| br i1 true, label %9, label %17 |
| |
| 9: |
| invoke void @f0() |
| to label %10 unwind label %1 |
| |
| 10: |
| invoke void @f2() |
| to label %11 unwind label %1 |
| |
| 11: |
| %12 = invoke signext i32 undef(i32* null, i32 signext undef, i1 zeroext undef) |
| to label %13 unwind label %14 |
| |
| 13: |
| unreachable |
| |
| 14: |
| %15 = landingpad { i8*, i32 } |
| catch i8* bitcast (i8** @g to i8*) |
| catch i8* null |
| br label %16 |
| |
| 16: |
| unreachable |
| |
| 17: |
| ret void |
| |
| ; uselistorder directives |
| uselistorder void ()* @f0, { 1, 0 } |
| uselistorder label %1, { 0, 3, 1, 2 } |
| } |