1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes="gvn-hoist" -S %s | FileCheck %s 3 4; Checks that gvn-hoist does not try to merge loads of the same source pointer 5; when the results are different types. 6 7define linkonce_odr void @i16i32(ptr %arg) { 8; CHECK-LABEL: @i16i32( 9; CHECK-NEXT: bb: 10; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2:%.*]] 11; CHECK: bb1: 12; CHECK-NEXT: [[T:%.*]] = load i16, ptr [[ARG:%.*]], align 4 13; CHECK-NEXT: br label [[BB2]] 14; CHECK: bb2: 15; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[ARG]], align 8 16; CHECK-NEXT: ret void 17; 18bb: 19 br i1 false, label %bb1, label %bb2 20 21bb1: ; preds = %bb 22 %t = load i16, ptr %arg, align 4 23 br label %bb2 24 25bb2: ; preds = %bb1, %bb 26 %t3 = load i32, ptr %arg, align 8 27 ret void 28} 29 30define linkonce_odr void @i32f32(ptr %arg) { 31; CHECK-LABEL: @i32f32( 32; CHECK-NEXT: bb: 33; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2:%.*]] 34; CHECK: bb1: 35; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[ARG:%.*]], align 4 36; CHECK-NEXT: br label [[BB2]] 37; CHECK: bb2: 38; CHECK-NEXT: [[T3:%.*]] = load float, ptr [[ARG]], align 8 39; CHECK-NEXT: ret void 40; 41bb: 42 br i1 false, label %bb1, label %bb2 43 44bb1: ; preds = %bb 45 %t = load i32, ptr %arg, align 4 46 br label %bb2 47 48bb2: ; preds = %bb1, %bb 49 %t3 = load float, ptr %arg, align 8 50 ret void 51} 52 53define linkonce_odr void @i64ptr(ptr %arg) { 54; CHECK-LABEL: @i64ptr( 55; CHECK-NEXT: bb: 56; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2:%.*]] 57; CHECK: bb1: 58; CHECK-NEXT: [[T:%.*]] = load i64, ptr [[ARG:%.*]], align 4 59; CHECK-NEXT: br label [[BB2]] 60; CHECK: bb2: 61; CHECK-NEXT: [[T3:%.*]] = load ptr, ptr [[ARG]], align 8 62; CHECK-NEXT: ret void 63; 64bb: 65 br i1 false, label %bb1, label %bb2 66 67bb1: ; preds = %bb 68 %t = load i64, ptr %arg, align 4 69 br label %bb2 70 71bb2: ; preds = %bb1, %bb 72 %t3 = load ptr, ptr %arg, align 8 73 ret void 74} 75 76define linkonce_odr void @ptrptr_diff_aspace(ptr %arg) { 77; CHECK-LABEL: @ptrptr_diff_aspace( 78; CHECK-NEXT: bb: 79; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2:%.*]] 80; CHECK: bb1: 81; CHECK-NEXT: [[T:%.*]] = load ptr addrspace(4), ptr [[ARG:%.*]], align 4 82; CHECK-NEXT: br label [[BB2]] 83; CHECK: bb2: 84; CHECK-NEXT: [[T3:%.*]] = load ptr addrspace(2), ptr [[ARG]], align 8 85; CHECK-NEXT: ret void 86; 87bb: 88 br i1 false, label %bb1, label %bb2 89 90bb1: ; preds = %bb 91 %t = load ptr addrspace(4), ptr %arg, align 4 92 br label %bb2 93 94bb2: ; preds = %bb1, %bb 95 %t3 = load ptr addrspace(2), ptr %arg, align 8 96 ret void 97} 98 99define linkonce_odr void @ptrptr(ptr %arg) { 100; CHECK-LABEL: @ptrptr( 101; CHECK-NEXT: bb: 102; CHECK-NEXT: [[T3:%.*]] = load ptr, ptr [[ARG:%.*]], align 4 103; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2:%.*]] 104; CHECK: bb1: 105; CHECK-NEXT: br label [[BB2]] 106; CHECK: bb2: 107; CHECK-NEXT: ret void 108; 109bb: 110 br i1 false, label %bb1, label %bb2 111 112bb1: ; preds = %bb 113 %t = load ptr, ptr %arg, align 4 114 br label %bb2 115 116bb2: ; preds = %bb1, %bb 117 %t3 = load ptr, ptr %arg, align 8 118 ret void 119} 120