1b2a885a2SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2b2a885a2SFlorian Hahn; RUN: opt -passes=ipsccp -S %s | FileCheck %s 3b2a885a2SFlorian Hahn 4*d37d4072SMikhail Gudim@g = global i64 0 5b2a885a2SFlorian Hahndeclare void @use(i1) 6b2a885a2SFlorian Hahn 7b2a885a2SFlorian Hahndefine i1 @freeze_undef_i1() { 8b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_i1( 9b2a885a2SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 undef 10b2a885a2SFlorian Hahn; CHECK-NEXT: ret i1 [[FR]] 11b2a885a2SFlorian Hahn; 12b2a885a2SFlorian Hahn %fr = freeze i1 undef 13b2a885a2SFlorian Hahn ret i1 %fr 14b2a885a2SFlorian Hahn} 15b2a885a2SFlorian Hahn 16b2a885a2SFlorian Hahndefine ptr @freeze_undef_ptr() { 17b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_ptr( 18b2a885a2SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze ptr undef 19b2a885a2SFlorian Hahn; CHECK-NEXT: ret ptr [[FR]] 20b2a885a2SFlorian Hahn; 21b2a885a2SFlorian Hahn %fr = freeze ptr undef 22b2a885a2SFlorian Hahn ret ptr %fr 23b2a885a2SFlorian Hahn} 24b2a885a2SFlorian Hahn 25b2a885a2SFlorian Hahndefine float @freeze_undef_float() { 26b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_float( 27b2a885a2SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze float undef 28b2a885a2SFlorian Hahn; CHECK-NEXT: ret float [[FR]] 29b2a885a2SFlorian Hahn; 30b2a885a2SFlorian Hahn %fr = freeze float undef 31b2a885a2SFlorian Hahn ret float %fr 32b2a885a2SFlorian Hahn} 33b2a885a2SFlorian Hahn 34b2a885a2SFlorian Hahndefine <2 x i32> @freeze_undef_vector() { 35b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_vector( 36b2a885a2SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze <2 x i32> undef 37b2a885a2SFlorian Hahn; CHECK-NEXT: ret <2 x i32> [[FR]] 38b2a885a2SFlorian Hahn; 39b2a885a2SFlorian Hahn %fr = freeze <2 x i32> undef 40b2a885a2SFlorian Hahn ret <2 x i32> %fr 41b2a885a2SFlorian Hahn} 42b2a885a2SFlorian Hahn 43*d37d4072SMikhail Gudimdefine i1 @freeze_const_i1() { 44*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_i1( 45*d37d4072SMikhail Gudim; CHECK-NEXT: ret i1 true 46*d37d4072SMikhail Gudim; 47*d37d4072SMikhail Gudim %fr = freeze i1 1 48*d37d4072SMikhail Gudim ret i1 %fr 49*d37d4072SMikhail Gudim} 50*d37d4072SMikhail Gudim 51*d37d4072SMikhail Gudimdefine ptr @freeze_const_ptr() { 52*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_ptr( 53*d37d4072SMikhail Gudim; CHECK-NEXT: ret ptr inttoptr (i32 256 to ptr) 54*d37d4072SMikhail Gudim; 55*d37d4072SMikhail Gudim %fr = freeze ptr inttoptr (i32 256 to ptr) 56*d37d4072SMikhail Gudim ret ptr %fr 57*d37d4072SMikhail Gudim} 58*d37d4072SMikhail Gudim 59*d37d4072SMikhail Gudimdefine float @freeze_const_float() { 60*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_float( 61*d37d4072SMikhail Gudim; CHECK-NEXT: ret float 2.500000e-01 62*d37d4072SMikhail Gudim; 63*d37d4072SMikhail Gudim %fr = freeze float 2.500000e-01 64*d37d4072SMikhail Gudim ret float %fr 65*d37d4072SMikhail Gudim} 66*d37d4072SMikhail Gudim 67*d37d4072SMikhail Gudimdefine <2 x i32> @freeze_const_vector() { 68*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_vector( 69*d37d4072SMikhail Gudim; CHECK-NEXT: ret <2 x i32> <i32 1, i32 2> 70*d37d4072SMikhail Gudim; 71*d37d4072SMikhail Gudim %fr = freeze <2 x i32> <i32 1, i32 2> 72*d37d4072SMikhail Gudim ret <2 x i32> %fr 73*d37d4072SMikhail Gudim} 74*d37d4072SMikhail Gudim 75*d37d4072SMikhail Gudim; make sure we don't constant-propagate values that could potentially be poison 76*d37d4072SMikhail Gudimdefine i64 @maybe_poison() { 77*d37d4072SMikhail Gudim; CHECK-LABEL: @maybe_poison( 78*d37d4072SMikhail Gudim; CHECK-NEXT: [[FR:%.*]] = freeze i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 123) 79*d37d4072SMikhail Gudim; CHECK-NEXT: ret i64 [[FR]] 80*d37d4072SMikhail Gudim; 81*d37d4072SMikhail Gudim %fr = freeze i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 123) 82*d37d4072SMikhail Gudim ret i64 %fr 83*d37d4072SMikhail Gudim} 84*d37d4072SMikhail Gudim 85*d37d4072SMikhail Gudimdefine {i64, i64} @freeze_struct({i64, i64} %s) { 86*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_struct( 87*d37d4072SMikhail Gudim; CHECK-NEXT: [[FR:%.*]] = freeze { i64, i64 } [[S:%.*]] 88*d37d4072SMikhail Gudim; CHECK-NEXT: ret { i64, i64 } [[FR]] 89*d37d4072SMikhail Gudim; 90*d37d4072SMikhail Gudim %fr = freeze {i64, i64} %s 91*d37d4072SMikhail Gudim ret {i64, i64} %fr 92*d37d4072SMikhail Gudim} 93*d37d4072SMikhail Gudim 94b2a885a2SFlorian Hahndefine i1 @propagate_range_from_and_through_freeze(i32 %x, i32 %y) { 95b2a885a2SFlorian Hahn; CHECK-LABEL: @propagate_range_from_and_through_freeze( 96b2a885a2SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 3 97b2a885a2SFlorian Hahn; CHECK-NEXT: [[AND_FR:%.*]] = freeze i32 [[AND]] 98b2a885a2SFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[AND_FR]], 100 99b2a885a2SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[F_1]]) 100b2a885a2SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[AND_FR]], 3 101b2a885a2SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 102b2a885a2SFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i32 [[AND_FR]], 3 103b2a885a2SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[F_2]]) 104b2a885a2SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[AND_FR]], [[Y:%.*]] 105b2a885a2SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 106b2a885a2SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[T_1]], [[F_1]] 107b2a885a2SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[F_2]] 108b2a885a2SFlorian Hahn; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_1]] 109b2a885a2SFlorian Hahn; CHECK-NEXT: ret i1 [[R_3]] 110b2a885a2SFlorian Hahn; 111b2a885a2SFlorian Hahn %and = and i32 %x, 3 112b2a885a2SFlorian Hahn %and.fr = freeze i32 %and 113b2a885a2SFlorian Hahn %f.1 = icmp eq i32 %and.fr, 100 114b2a885a2SFlorian Hahn call void @use(i1 %f.1) 115b2a885a2SFlorian Hahn %t.1 = icmp ule i32 %and.fr, 3 116b2a885a2SFlorian Hahn call void @use(i1 %t.1) 117b2a885a2SFlorian Hahn %f.2 = icmp ugt i32 %and.fr, 3 118b2a885a2SFlorian Hahn call void @use(i1 %f.2) 119b2a885a2SFlorian Hahn %c.1 = icmp eq i32 %and.fr, %y 120b2a885a2SFlorian Hahn call void @use(i1 %c.1) 121b2a885a2SFlorian Hahn %r.1 = xor i1 %t.1, %f.1 122b2a885a2SFlorian Hahn %r.2 = xor i1 %r.1, %f.2 123b2a885a2SFlorian Hahn %r.3 = xor i1 %r.2, %c.1 124b2a885a2SFlorian Hahn ret i1 %r.3 125b2a885a2SFlorian Hahn} 126b2a885a2SFlorian Hahn 127b2a885a2SFlorian Hahndefine i1 @range_from_phi_with_undef(i1 %c.1, i1 %c.2) { 128b2a885a2SFlorian Hahn; CHECK-LABEL: @range_from_phi_with_undef( 129b2a885a2SFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]] 130b2a885a2SFlorian Hahn; CHECK: true.1: 131b2a885a2SFlorian Hahn; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]] 132b2a885a2SFlorian Hahn; CHECK: true.2: 133b2a885a2SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 134b2a885a2SFlorian Hahn; CHECK: false: 135b2a885a2SFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 136b2a885a2SFlorian Hahn; CHECK: exit: 137b2a885a2SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ 10, [[TRUE_1]] ], [ 20, [[TRUE_2]] ], [ undef, [[FALSE]] ] 138b2a885a2SFlorian Hahn; CHECK-NEXT: [[P_FR:%.*]] = freeze i32 [[P]] 139b2a885a2SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[P_FR]], 20 140b2a885a2SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp uge i32 [[P_FR]], 10 141b2a885a2SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = xor i1 [[T_1]], [[T_2]] 142b2a885a2SFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 143b2a885a2SFlorian Hahn; 144b2a885a2SFlorian Hahn br i1 %c.1, label %true.1, label %false 145b2a885a2SFlorian Hahn 146b2a885a2SFlorian Hahntrue.1: 147b2a885a2SFlorian Hahn br i1 %c.2, label %true.2, label %exit 148b2a885a2SFlorian Hahn 149b2a885a2SFlorian Hahntrue.2: 150b2a885a2SFlorian Hahn br label %exit 151b2a885a2SFlorian Hahn 152b2a885a2SFlorian Hahnfalse: 153b2a885a2SFlorian Hahn br label %exit 154b2a885a2SFlorian Hahn 155b2a885a2SFlorian Hahnexit: 156b2a885a2SFlorian Hahn %p = phi i32 [ 10, %true.1 ], [ 20, %true.2], [ undef, %false ] 157b2a885a2SFlorian Hahn %p.fr = freeze i32 %p 158b2a885a2SFlorian Hahn %t.1 = icmp ule i32 %p.fr, 20 159b2a885a2SFlorian Hahn %t.2 = icmp uge i32 %p.fr, 10 160b2a885a2SFlorian Hahn %res = xor i1 %t.1, %t.2 161b2a885a2SFlorian Hahn ret i1 %res 162b2a885a2SFlorian Hahn} 163b2a885a2SFlorian Hahn 164b2a885a2SFlorian Hahndefine i32 @propagate_info_from_predicate_through_freeze(i32 %x) { 165b2a885a2SFlorian Hahn; CHECK-LABEL: @propagate_info_from_predicate_through_freeze( 166b2a885a2SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 10 167b2a885a2SFlorian Hahn; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]] 168b2a885a2SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 169b2a885a2SFlorian Hahn; CHECK: then: 170b2a885a2SFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[X_FR]], 10 171b2a885a2SFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add i32 [[X_FR]], 1 172b2a885a2SFlorian Hahn; CHECK-NEXT: ret i32 [[ADD_2]] 173b2a885a2SFlorian Hahn; CHECK: else: 174b2a885a2SFlorian Hahn; CHECK-NEXT: [[ADD_3:%.*]] = add i32 [[X_FR]], 1 175b2a885a2SFlorian Hahn; CHECK-NEXT: ret i32 [[ADD_3]] 176b2a885a2SFlorian Hahn; 177b2a885a2SFlorian Hahn %cmp = icmp eq i32 %x, 10 178b2a885a2SFlorian Hahn %x.fr = freeze i32 %x 179b2a885a2SFlorian Hahn br i1 %cmp, label %then, label %else 180b2a885a2SFlorian Hahn 181b2a885a2SFlorian Hahnthen: 182b2a885a2SFlorian Hahn %add.1 = add i32 %x.fr, %x 183b2a885a2SFlorian Hahn %add.2 = add i32 %x.fr, 1 184b2a885a2SFlorian Hahn ret i32 %add.2 185b2a885a2SFlorian Hahn 186b2a885a2SFlorian Hahnelse: 187b2a885a2SFlorian Hahn %add.3 = add i32 %x.fr, 1 188b2a885a2SFlorian Hahn ret i32 %add.3 189b2a885a2SFlorian Hahn} 190