1 ; RUN: opt < %s -early-cse-memssa -gvn-hoist -S | FileCheck %s 2 3 ; Make sure opt won't crash and that this pair of 4 ; instructions (load, icmp) is hoisted successfully 5 ; from bb45 and bb58 to bb41. 6 7 @g_10 = external global i32, align 4 8 @g_536 = external global i8*, align 8 9 @g_1629 = external global i32**, align 8 10 @g_963 = external global i32**, align 8 11 @g_1276 = external global i32**, align 8 12 13 ;CHECK-LABEL: @func_22 14 15 define void @func_22(i32* %arg, i32* %arg1) { 16 bb: 17 br label %bb12 18 19 bb12: 20 %tmp3.0 = phi i32 [ undef, %bb ], [ %tmp40, %bb36 ] 21 %tmp7.0 = phi i32 [ undef, %bb ], [ %spec.select, %bb36 ] 22 %tmp14 = icmp eq i32 %tmp3.0, 6 23 br i1 %tmp14, label %bb41, label %bb15 24 25 bb15: 26 %tmp183 = trunc i16 0 to i8 27 %tmp20 = load i8*, i8** @g_536, align 8 28 %tmp21 = load i8, i8* %tmp20, align 1 29 %tmp23 = or i8 %tmp21, %tmp183 30 store i8 %tmp23, i8* %tmp20, align 1 31 %tmp5.i = icmp eq i8 %tmp23, 0 32 br i1 %tmp5.i, label %safe_div_func_uint8_t_u_u.exit, label %bb8.i 33 34 bb8.i: 35 %0 = udiv i8 1, %tmp23 36 br label %safe_div_func_uint8_t_u_u.exit 37 38 safe_div_func_uint8_t_u_u.exit: 39 %tmp13.in.i = phi i8 [ %0, %bb8.i ], [ 1, %bb15 ] 40 %tmp31 = icmp eq i8 %tmp13.in.i, 0 41 %spec.select = select i1 %tmp31, i32 %tmp7.0, i32 53 42 %tmp35 = icmp eq i32 %spec.select, 0 43 br i1 %tmp35, label %bb36, label %bb41 44 45 bb36: 46 %tmp38 = sext i32 %tmp3.0 to i64 47 %tmp40 = trunc i64 %tmp38 to i32 48 br label %bb12 49 50 ;CHECK: bb41: 51 ;CHECK: %tmp47 = load i32, i32* %arg1, align 4 52 ;CHECK: %tmp48 = icmp eq i32 %tmp47, 0 53 54 bb41: 55 %tmp43 = load i32, i32* %arg, align 4 56 %tmp44 = icmp eq i32 %tmp43, 0 57 br i1 %tmp44, label %bb52, label %bb45 58 59 ;CHECK: bb45: 60 ;CHECK-NOT: %tmp47 = load i32, i32* %arg1, align 4 61 ;CHECK-NOT: %tmp48 = icmp eq i32 %tmp47, 0 62 63 bb45: 64 %tmp47 = load i32, i32* %arg1, align 4 65 %tmp48 = icmp eq i32 %tmp47, 0 66 br i1 %tmp48, label %bb50, label %bb64 67 68 bb50: 69 %tmp51 = load volatile i32**, i32*** @g_963, align 8 70 unreachable 71 72 bb52: 73 %tmp8.0 = phi i32 [ undef, %bb41 ], [ %tmp57, %bb55 ] 74 %tmp54 = icmp slt i32 %tmp8.0, 3 75 br i1 %tmp54, label %bb55, label %bb58 76 77 bb55: 78 %tmp57 = add nsw i32 %tmp8.0, 1 79 br label %bb52 80 81 ;CHECK: bb58: 82 ;CHECK-NOT: %tmp60 = load i32, i32* %arg1, align 4 83 ;CHECK-NOT: %tmp61 = icmp eq i32 %tmp60, 0 84 85 bb58: 86 %tmp60 = load i32, i32* %arg1, align 4 87 %tmp61 = icmp eq i32 %tmp60, 0 88 br i1 %tmp61, label %bb62, label %bb64 89 90 bb62: 91 %tmp63 = load volatile i32**, i32*** @g_1276, align 8 92 unreachable 93 94 bb64: 95 %tmp65 = load volatile i32**, i32*** @g_1629, align 8 96 unreachable 97 98 ; uselistorder directives 99 uselistorder i32 %spec.select, { 1, 0 } 100 uselistorder i32* %arg1, { 1, 0 } 101 uselistorder label %bb64, { 1, 0 } 102 uselistorder label %bb52, { 1, 0 } 103 uselistorder label %bb41, { 1, 0 } 104 uselistorder label %safe_div_func_uint8_t_u_u.exit, { 1, 0 } 105 } 106 107 define zeroext i8 @safe_div_func_uint8_t_u_u(i8 zeroext %arg, i8 zeroext %arg1) { 108 bb: 109 %tmp5 = icmp eq i8 %arg1, 0 110 br i1 %tmp5, label %bb12, label %bb8 111 112 bb8: 113 %0 = udiv i8 %arg, %arg1 114 br label %bb12 115 116 bb12: 117 %tmp13.in = phi i8 [ %0, %bb8 ], [ %arg, %bb ] 118 ret i8 %tmp13.in 119 } 120