1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=ipsccp -S %s | FileCheck %s 3 4@y = common global [1 x i32] zeroinitializer, align 4 5@x = common global [1 x i32] zeroinitializer, align 4 6 7define i32 @eq_undereferenceable(ptr %p) { 8; CHECK-LABEL: @eq_undereferenceable( 9; CHECK-NEXT: entry: 10; CHECK-NEXT: store i32 1, ptr @y, align 4 11; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P:%.*]], getelementptr inbounds (i32, ptr @x, i64 1) 12; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 13; CHECK: if.then: 14; CHECK-NEXT: store i32 2, ptr getelementptr inbounds (i32, ptr @x, i64 1), align 4 15; CHECK-NEXT: br label [[IF_END]] 16; CHECK: if.end: 17; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @y, align 4 18; CHECK-NEXT: ret i32 [[TMP0]] 19; 20entry: 21 store i32 1, ptr @y, align 4 22 %cmp = icmp eq ptr %p, getelementptr inbounds (i32, ptr @x, i64 1) 23 br i1 %cmp, label %if.then, label %if.end 24 25if.then: ; preds = %entry 26 store i32 2, ptr %p, align 4 27 br label %if.end 28 29if.end: ; preds = %if.then, %entry 30 %0 = load i32, ptr @y, align 4 31 ret i32 %0 32} 33 34 35define i32 @eq_dereferenceable(ptr %p) { 36; CHECK-LABEL: @eq_dereferenceable( 37; CHECK-NEXT: entry: 38; CHECK-NEXT: store i32 1, ptr @y, align 4 39; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P:%.*]], @x 40; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 41; CHECK: if.then: 42; CHECK-NEXT: store i32 2, ptr @x, align 4 43; CHECK-NEXT: br label [[IF_END]] 44; CHECK: if.end: 45; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @y, align 4 46; CHECK-NEXT: ret i32 [[TMP0]] 47; 48entry: 49 store i32 1, ptr @y, align 4 50 %cmp = icmp eq ptr %p, @x 51 br i1 %cmp, label %if.then, label %if.end 52 53if.then: ; preds = %entry 54 store i32 2, ptr %p, align 4 55 br label %if.end 56 57if.end: ; preds = %if.then, %entry 58 %0 = load i32, ptr @y, align 4 59 ret i32 %0 60} 61 62define i1 @eq_undereferenceable_cmp_simp(ptr %p) { 63; CHECK-LABEL: @eq_undereferenceable_cmp_simp( 64; CHECK-NEXT: entry: 65; CHECK-NEXT: [[CMP_0:%.*]] = icmp eq ptr [[P:%.*]], getelementptr inbounds (i32, ptr @x, i64 1) 66; CHECK-NEXT: br i1 [[CMP_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 67; CHECK: if.then: 68; CHECK-NEXT: store i32 2, ptr getelementptr inbounds (i32, ptr @x, i64 1), align 4 69; CHECK-NEXT: ret i1 true 70; CHECK: if.end: 71; CHECK-NEXT: ret i1 false 72; 73entry: 74 %cmp.0 = icmp eq ptr %p, getelementptr inbounds (i32, ptr @x, i64 1) 75 br i1 %cmp.0, label %if.then, label %if.end 76 77if.then: ; preds = %entry 78 store i32 2, ptr %p, align 4 79 %cmp.1 = icmp eq ptr %p, getelementptr inbounds (i32, ptr @x, i64 1) 80 ret i1 %cmp.1 81 82if.end: ; preds = %if.then, %entry 83 %cmp.2 = icmp eq ptr %p, getelementptr inbounds (i32, ptr @x, i64 1) 84 ret i1 %cmp.2 85} 86