1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes 2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM 3; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM 4; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM 5; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM 6 7target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 8declare void @f(i32) 9declare token @llvm.call.preallocated.setup(i32) 10declare i8* @llvm.call.preallocated.arg(token, i32) 11 12; Test1: Replace argument with constant 13define internal void @test1(i32 %a) { 14; CHECK-LABEL: define {{[^@]+}}@test1() { 15; CHECK-NEXT: tail call void @f(i32 noundef 1) 16; CHECK-NEXT: ret void 17; 18 tail call void @f(i32 %a) 19 ret void 20} 21 22define void @test1_helper() { 23; CHECK-LABEL: define {{[^@]+}}@test1_helper() { 24; CHECK-NEXT: tail call void @test1() 25; CHECK-NEXT: ret void 26; 27 tail call void @test1(i32 1) 28 ret void 29} 30 31; TEST 2 : Simplify return value 32define i32 @return0() { 33; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 34; IS__TUNIT____-LABEL: define {{[^@]+}}@return0 35; IS__TUNIT____-SAME: () [[ATTR1:#.*]] { 36; IS__TUNIT____-NEXT: ret i32 0 37; 38; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 39; IS__CGSCC____-LABEL: define {{[^@]+}}@return0 40; IS__CGSCC____-SAME: () [[ATTR1:#.*]] { 41; IS__CGSCC____-NEXT: ret i32 0 42; 43 ret i32 0 44} 45 46define i32 @return1() { 47; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 48; IS__TUNIT____-LABEL: define {{[^@]+}}@return1 49; IS__TUNIT____-SAME: () [[ATTR1]] { 50; IS__TUNIT____-NEXT: ret i32 1 51; 52; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 53; IS__CGSCC____-LABEL: define {{[^@]+}}@return1 54; IS__CGSCC____-SAME: () [[ATTR1]] { 55; IS__CGSCC____-NEXT: ret i32 1 56; 57 ret i32 1 58} 59 60define i32 @test2_1(i1 %c) { 61; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 62; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_1 63; IS__TUNIT____-SAME: (i1 [[C:%.*]]) [[ATTR1]] { 64; IS__TUNIT____-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 65; IS__TUNIT____: if.true: 66; IS__TUNIT____-NEXT: [[RET0:%.*]] = add i32 0, 1 67; IS__TUNIT____-NEXT: br label [[END:%.*]] 68; IS__TUNIT____: if.false: 69; IS__TUNIT____-NEXT: br label [[END]] 70; IS__TUNIT____: end: 71; IS__TUNIT____-NEXT: [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 72; IS__TUNIT____-NEXT: ret i32 1 73; 74; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 75; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_1 76; IS__CGSCC____-SAME: (i1 [[C:%.*]]) [[ATTR1]] { 77; IS__CGSCC____-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 78; IS__CGSCC____: if.true: 79; IS__CGSCC____-NEXT: [[RET0:%.*]] = add i32 0, 1 80; IS__CGSCC____-NEXT: br label [[END:%.*]] 81; IS__CGSCC____: if.false: 82; IS__CGSCC____-NEXT: br label [[END]] 83; IS__CGSCC____: end: 84; IS__CGSCC____-NEXT: [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 85; IS__CGSCC____-NEXT: ret i32 1 86; 87 br i1 %c, label %if.true, label %if.false 88if.true: 89 %call = tail call i32 @return0() 90 %ret0 = add i32 %call, 1 91 br label %end 92if.false: 93 %ret1 = tail call i32 @return1() 94 br label %end 95end: 96 97 %ret = phi i32 [ %ret0, %if.true ], [ %ret1, %if.false ] 98 99 ret i32 1 100} 101 102 103 104define i32 @test2_2(i1 %c) { 105; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 106; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_2 107; IS__TUNIT____-SAME: (i1 [[C:%.*]]) [[ATTR1]] { 108; IS__TUNIT____-NEXT: ret i32 1 109; 110; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 111; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_2 112; IS__CGSCC____-SAME: (i1 [[C:%.*]]) [[ATTR1]] { 113; IS__CGSCC____-NEXT: ret i32 1 114; 115 %ret = tail call i32 @test2_1(i1 %c) 116 ret i32 %ret 117} 118 119declare void @use(i32) 120define void @test3(i1 %c) { 121; CHECK-LABEL: define {{[^@]+}}@test3 122; CHECK-SAME: (i1 [[C:%.*]]) { 123; CHECK-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 124; CHECK: if.true: 125; CHECK-NEXT: br label [[END:%.*]] 126; CHECK: if.false: 127; CHECK-NEXT: br label [[END]] 128; CHECK: end: 129; CHECK-NEXT: [[R:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 130; CHECK-NEXT: tail call void @use(i32 noundef 1) 131; CHECK-NEXT: ret void 132; 133 br i1 %c, label %if.true, label %if.false 134if.true: 135 br label %end 136if.false: 137 %ret1 = tail call i32 @return1() 138 br label %end 139end: 140 141 %r = phi i32 [ 1, %if.true ], [ %ret1, %if.false ] 142 143 tail call void @use(i32 %r) 144 ret void 145} 146 147define void @test-select-phi(i1 %c) { 148; CHECK-LABEL: define {{[^@]+}}@test-select-phi 149; CHECK-SAME: (i1 [[C:%.*]]) { 150; CHECK-NEXT: tail call void @use(i32 noundef 1) 151; CHECK-NEXT: [[SELECT_NOT_SAME:%.*]] = select i1 [[C]], i32 1, i32 0 152; CHECK-NEXT: tail call void @use(i32 noundef [[SELECT_NOT_SAME]]) 153; CHECK-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 154; CHECK: if-true: 155; CHECK-NEXT: br label [[END:%.*]] 156; CHECK: if-false: 157; CHECK-NEXT: br label [[END]] 158; CHECK: end: 159; CHECK-NEXT: [[PHI_SAME:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 160; CHECK-NEXT: [[PHI_NOT_SAME:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 161; CHECK-NEXT: [[PHI_SAME_PROP:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] 162; CHECK-NEXT: [[PHI_SAME_UNDEF:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ undef, [[IF_FALSE]] ] 163; CHECK-NEXT: [[SELECT_NOT_SAME_UNDEF:%.*]] = select i1 [[C]], i32 [[PHI_NOT_SAME]], i32 undef 164; CHECK-NEXT: tail call void @use(i32 noundef 1) 165; CHECK-NEXT: tail call void @use(i32 noundef [[PHI_NOT_SAME]]) 166; CHECK-NEXT: tail call void @use(i32 noundef 1) 167; CHECK-NEXT: tail call void @use(i32 1) 168; CHECK-NEXT: tail call void @use(i32 [[SELECT_NOT_SAME_UNDEF]]) 169; CHECK-NEXT: ret void 170; 171 %select-same = select i1 %c, i32 1, i32 1 172 tail call void @use(i32 %select-same) 173 174 %select-not-same = select i1 %c, i32 1, i32 0 175 tail call void @use(i32 %select-not-same) 176 br i1 %c, label %if-true, label %if-false 177if-true: 178 br label %end 179if-false: 180 br label %end 181end: 182 %phi-same = phi i32 [ 1, %if-true ], [ 1, %if-false ] 183 %phi-not-same = phi i32 [ 0, %if-true ], [ 1, %if-false ] 184 %phi-same-prop = phi i32 [ 1, %if-true ], [ %select-same, %if-false ] 185 %phi-same-undef = phi i32 [ 1, %if-true ], [ undef, %if-false ] 186 %select-not-same-undef = select i1 %c, i32 %phi-not-same, i32 undef 187 188 189 tail call void @use(i32 %phi-same) 190 191 tail call void @use(i32 %phi-not-same) 192 193 tail call void @use(i32 %phi-same-prop) 194 195 tail call void @use(i32 %phi-same-undef) 196 197 tail call void @use(i32 %select-not-same-undef) 198 199 ret void 200 201} 202 203define i32 @ipccp1(i32 %a) { 204; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 205; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp1 206; IS__TUNIT____-SAME: (i32 returned [[A:%.*]]) [[ATTR1]] { 207; IS__TUNIT____-NEXT: br i1 true, label [[T:%.*]], label [[F:%.*]] 208; IS__TUNIT____: t: 209; IS__TUNIT____-NEXT: ret i32 [[A]] 210; IS__TUNIT____: f: 211; IS__TUNIT____-NEXT: unreachable 212; 213; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 214; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp1 215; IS__CGSCC____-SAME: (i32 returned [[A:%.*]]) [[ATTR1]] { 216; IS__CGSCC____-NEXT: br i1 true, label [[T:%.*]], label [[F:%.*]] 217; IS__CGSCC____: t: 218; IS__CGSCC____-NEXT: ret i32 [[A]] 219; IS__CGSCC____: f: 220; IS__CGSCC____-NEXT: unreachable 221; 222 br i1 true, label %t, label %f 223t: 224 ret i32 %a 225f: 226 %r = call i32 @ipccp1(i32 5) 227 ret i32 %r 228} 229 230define internal i1 @ipccp2i(i1 %a) { 231; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 232; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2i 233; IS__CGSCC____-SAME: () [[ATTR1]] { 234; IS__CGSCC____-NEXT: br label [[T:%.*]] 235; IS__CGSCC____: t: 236; IS__CGSCC____-NEXT: ret i1 undef 237; IS__CGSCC____: f: 238; IS__CGSCC____-NEXT: unreachable 239; 240 br i1 %a, label %t, label %f 241t: 242 ret i1 %a 243f: 244 %r = call i1 @ipccp2i(i1 false) 245 ret i1 %r 246} 247 248define i1 @ipccp2() { 249; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 250; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2 251; IS__TUNIT____-SAME: () [[ATTR1]] { 252; IS__TUNIT____-NEXT: ret i1 true 253; 254; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 255; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2 256; IS__CGSCC____-SAME: () [[ATTR1]] { 257; IS__CGSCC____-NEXT: ret i1 true 258; 259 %r = call i1 @ipccp2i(i1 true) 260 ret i1 %r 261} 262 263define internal i1 @ipccp2ib(i1 %a) { 264; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 265; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2ib 266; IS__CGSCC____-SAME: () [[ATTR1]] { 267; IS__CGSCC____-NEXT: br label [[T:%.*]] 268; IS__CGSCC____: t: 269; IS__CGSCC____-NEXT: ret i1 undef 270; IS__CGSCC____: f: 271; IS__CGSCC____-NEXT: unreachable 272; 273 br i1 %a, label %t, label %f 274t: 275 ret i1 true 276f: 277 %r = call i1 @ipccp2ib(i1 false) 278 ret i1 %r 279} 280 281define i1 @ipccp2b() { 282; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 283; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2b 284; IS__TUNIT____-SAME: () [[ATTR1]] { 285; IS__TUNIT____-NEXT: ret i1 true 286; 287; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 288; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2b 289; IS__CGSCC____-SAME: () [[ATTR1]] { 290; IS__CGSCC____-NEXT: ret i1 true 291; 292 %r = call i1 @ipccp2ib(i1 true) 293 ret i1 %r 294} 295 296define internal i32 @ipccp3i(i32 %a) { 297; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 298; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3i 299; IS__CGSCC____-SAME: () [[ATTR1]] { 300; IS__CGSCC____-NEXT: br label [[T:%.*]] 301; IS__CGSCC____: t: 302; IS__CGSCC____-NEXT: ret i32 undef 303; IS__CGSCC____: f: 304; IS__CGSCC____-NEXT: unreachable 305; 306 %c = icmp eq i32 %a, 7 307 br i1 %c, label %t, label %f 308t: 309 ret i32 %a 310f: 311 %r = call i32 @ipccp3i(i32 5) 312 ret i32 %r 313} 314 315define i32 @ipccp3() { 316; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 317; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp3 318; IS__TUNIT____-SAME: () [[ATTR1]] { 319; IS__TUNIT____-NEXT: ret i32 7 320; 321; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 322; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3 323; IS__CGSCC____-SAME: () [[ATTR1]] { 324; IS__CGSCC____-NEXT: ret i32 7 325; 326 %r = call i32 @ipccp3i(i32 7) 327 ret i32 %r 328} 329 330; Do not touch complicated arguments (for now) 331%struct.X = type { i8* } 332define internal i32* @test_inalloca(i32* inalloca %a) { 333; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 334; IS__TUNIT____-LABEL: define {{[^@]+}}@test_inalloca 335; IS__TUNIT____-SAME: (i32* inalloca noalias nofree nonnull returned writeonly dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 336; IS__TUNIT____-NEXT: ret i32* [[A]] 337; 338; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 339; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inalloca 340; IS__CGSCC____-SAME: (i32* inalloca noalias nofree noundef nonnull returned writeonly dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 341; IS__CGSCC____-NEXT: ret i32* [[A]] 342; 343 ret i32* %a 344} 345define i32* @complicated_args_inalloca(i32* %arg) { 346; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 347; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_inalloca 348; IS__TUNIT____-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1]] { 349; IS__TUNIT____-NEXT: [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree writeonly "no-capture-maybe-returned" [[ARG]]) [[ATTR1]] 350; IS__TUNIT____-NEXT: ret i32* [[CALL]] 351; 352; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 353; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_inalloca 354; IS__CGSCC_OPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1:#.*]] { 355; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) [[ATTR5:#.*]] 356; IS__CGSCC_OPM-NEXT: ret i32* [[CALL]] 357; 358; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 359; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_inalloca 360; IS__CGSCC_NPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1:#.*]] { 361; IS__CGSCC_NPM-NEXT: [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) [[ATTR4:#.*]] 362; IS__CGSCC_NPM-NEXT: ret i32* [[CALL]] 363; 364 %call = call i32* @test_inalloca(i32* %arg) 365 ret i32* %call 366} 367 368define internal i32* @test_preallocated(i32* preallocated(i32) %a) { 369; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 370; IS__TUNIT____-LABEL: define {{[^@]+}}@test_preallocated 371; IS__TUNIT____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 372; IS__TUNIT____-NEXT: ret i32* [[A]] 373; 374; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 375; IS__CGSCC____-LABEL: define {{[^@]+}}@test_preallocated 376; IS__CGSCC____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 377; IS__CGSCC____-NEXT: ret i32* [[A]] 378; 379 ret i32* %a 380} 381define i32* @complicated_args_preallocated() { 382; IS__TUNIT_OPM: Function Attrs: nofree nosync nounwind willreturn 383; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated 384; IS__TUNIT_OPM-SAME: () [[ATTR0:#.*]] { 385; IS__TUNIT_OPM-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR5:#.*]] 386; IS__TUNIT_OPM-NEXT: [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR1:#.*]] [ "preallocated"(token [[C]]) ] 387; IS__TUNIT_OPM-NEXT: ret i32* [[CALL]] 388; 389; IS__TUNIT_NPM: Function Attrs: nofree nosync nounwind willreturn 390; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated 391; IS__TUNIT_NPM-SAME: () [[ATTR0:#.*]] { 392; IS__TUNIT_NPM-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR4:#.*]] 393; IS__TUNIT_NPM-NEXT: [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR1:#.*]] [ "preallocated"(token [[C]]) ] 394; IS__TUNIT_NPM-NEXT: ret i32* [[CALL]] 395; 396; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind willreturn 397; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated 398; IS__CGSCC_OPM-SAME: () [[ATTR0:#.*]] { 399; IS__CGSCC_OPM-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR5]] 400; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR6:#.*]] [ "preallocated"(token [[C]]) ] 401; IS__CGSCC_OPM-NEXT: ret i32* [[CALL]] 402; 403; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind willreturn 404; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated 405; IS__CGSCC_NPM-SAME: () [[ATTR0:#.*]] { 406; IS__CGSCC_NPM-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR4]] 407; IS__CGSCC_NPM-NEXT: [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR5:#.*]] [ "preallocated"(token [[C]]) ] 408; IS__CGSCC_NPM-NEXT: ret i32* [[CALL]] 409; 410 %c = call token @llvm.call.preallocated.setup(i32 1) 411 %call = call i32* @test_preallocated(i32* preallocated(i32) null) ["preallocated"(token %c)] 412 ret i32* %call 413} 414 415define internal void @test_sret(%struct.X* sret(%struct.X) %a, %struct.X** %b) { 416; 417; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 418; IS__TUNIT____-LABEL: define {{[^@]+}}@test_sret 419; IS__TUNIT____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret(%struct.X) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2:#.*]] { 420; IS__TUNIT____-NEXT: store %struct.X* [[A]], %struct.X** [[B]], align 8 421; IS__TUNIT____-NEXT: ret void 422; 423; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 424; IS__CGSCC____-LABEL: define {{[^@]+}}@test_sret 425; IS__CGSCC____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret(%struct.X) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2:#.*]] { 426; IS__CGSCC____-NEXT: store %struct.X* [[A]], %struct.X** [[B]], align 8 427; IS__CGSCC____-NEXT: ret void 428; 429 store %struct.X* %a, %struct.X** %b 430 ret void 431} 432; FIXME: Alignment and dereferenceability are not propagated to the argument 433define void @complicated_args_sret(%struct.X** %b) { 434; 435; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 436; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_sret 437; IS__TUNIT_OPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) [[ATTR2:#.*]] { 438; IS__TUNIT_OPM-NEXT: call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) [[ATTR6:#.*]] 439; IS__TUNIT_OPM-NEXT: ret void 440; 441; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 442; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_sret 443; IS__TUNIT_NPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) [[ATTR2:#.*]] { 444; IS__TUNIT_NPM-NEXT: call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) [[ATTR5:#.*]] 445; IS__TUNIT_NPM-NEXT: ret void 446; 447; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 448; IS__CGSCC____-LABEL: define {{[^@]+}}@complicated_args_sret 449; IS__CGSCC____-SAME: (%struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2]] { 450; IS__CGSCC____-NEXT: unreachable 451; 452 call void @test_sret(%struct.X* null, %struct.X** %b) 453 ret void 454} 455 456define internal %struct.X* @test_nest(%struct.X* nest %a) { 457; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 458; IS__TUNIT____-LABEL: define {{[^@]+}}@test_nest 459; IS__TUNIT____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 460; IS__TUNIT____-NEXT: ret %struct.X* [[A]] 461; 462; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 463; IS__CGSCC____-LABEL: define {{[^@]+}}@test_nest 464; IS__CGSCC____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] { 465; IS__CGSCC____-NEXT: ret %struct.X* [[A]] 466; 467 ret %struct.X* %a 468} 469define %struct.X* @complicated_args_nest() { 470; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 471; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_nest 472; IS__TUNIT____-SAME: () [[ATTR1]] { 473; IS__TUNIT____-NEXT: [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR1]] 474; IS__TUNIT____-NEXT: ret %struct.X* [[CALL]] 475; 476; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 477; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_nest 478; IS__CGSCC_OPM-SAME: () [[ATTR1]] { 479; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR5]] 480; IS__CGSCC_OPM-NEXT: ret %struct.X* [[CALL]] 481; 482; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 483; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_nest 484; IS__CGSCC_NPM-SAME: () [[ATTR1]] { 485; IS__CGSCC_NPM-NEXT: [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR4]] 486; IS__CGSCC_NPM-NEXT: ret %struct.X* [[CALL]] 487; 488 %call = call %struct.X* @test_nest(%struct.X* null) 489 ret %struct.X* %call 490} 491 492@S = external global %struct.X 493define internal void @test_byval(%struct.X* byval(%struct.X) %a) { 494; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 495; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test_byval 496; IS__CGSCC_OPM-SAME: (%struct.X* noalias nocapture nofree noundef nonnull writeonly byval(%struct.X) align 8 dereferenceable(8) [[A:%.*]]) [[ATTR1]] { 497; IS__CGSCC_OPM-NEXT: [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* [[A]], i32 0, i32 0 498; IS__CGSCC_OPM-NEXT: store i8* null, i8** [[G0]], align 8 499; IS__CGSCC_OPM-NEXT: ret void 500; 501; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 502; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test_byval 503; IS__CGSCC_NPM-SAME: (i8* noalias nocapture nofree readnone [[TMP0:%.*]]) [[ATTR1]] { 504; IS__CGSCC_NPM-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8 505; IS__CGSCC_NPM-NEXT: [[A_PRIV_CAST:%.*]] = bitcast %struct.X* [[A_PRIV]] to i8** 506; IS__CGSCC_NPM-NEXT: store i8* [[TMP0]], i8** [[A_PRIV_CAST]], align 8 507; IS__CGSCC_NPM-NEXT: [[G0:%.*]] = getelementptr [[STRUCT_X]], %struct.X* [[A_PRIV]], i32 0, i32 0 508; IS__CGSCC_NPM-NEXT: store i8* null, i8** [[G0]], align 8 509; IS__CGSCC_NPM-NEXT: ret void 510; 511 %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0 512 store i8* null, i8** %g0 513 ret void 514} 515define void @complicated_args_byval() { 516; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 517; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval 518; IS__TUNIT____-SAME: () [[ATTR1]] { 519; IS__TUNIT____-NEXT: ret void 520; 521; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 522; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval 523; IS__CGSCC_OPM-SAME: () [[ATTR1]] { 524; IS__CGSCC_OPM-NEXT: ret void 525; 526; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn 527; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval 528; IS__CGSCC_NPM-SAME: () [[ATTR3:#.*]] { 529; IS__CGSCC_NPM-NEXT: ret void 530; 531 call void @test_byval(%struct.X* @S) 532 ret void 533} 534 535define internal i8*@test_byval2(%struct.X* byval(%struct.X) %a) { 536; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn 537; IS__TUNIT____-LABEL: define {{[^@]+}}@test_byval2 538; IS__TUNIT____-SAME: () [[ATTR3:#.*]] { 539; IS__TUNIT____-NEXT: [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0 540; IS__TUNIT____-NEXT: [[L:%.*]] = load i8*, i8** [[G0]], align 8 541; IS__TUNIT____-NEXT: ret i8* [[L]] 542; 543; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readonly willreturn 544; IS__CGSCC____-LABEL: define {{[^@]+}}@test_byval2 545; IS__CGSCC____-SAME: () [[ATTR3:#.*]] { 546; IS__CGSCC____-NEXT: [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0 547; IS__CGSCC____-NEXT: [[L:%.*]] = load i8*, i8** [[G0]], align 8 548; IS__CGSCC____-NEXT: ret i8* [[L]] 549; 550 %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0 551 %l = load i8*, i8** %g0 552 ret i8* %l 553} 554define i8* @complicated_args_byval2() { 555; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn 556; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval2 557; IS__TUNIT____-SAME: () [[ATTR3]] { 558; IS__TUNIT____-NEXT: [[C:%.*]] = call i8* @test_byval2() [[ATTR3]] 559; IS__TUNIT____-NEXT: ret i8* [[C]] 560; 561; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn 562; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval2 563; IS__CGSCC_OPM-SAME: () [[ATTR3:#.*]] { 564; IS__CGSCC_OPM-NEXT: [[C:%.*]] = call i8* @test_byval2() [[ATTR7:#.*]] 565; IS__CGSCC_OPM-NEXT: ret i8* [[C]] 566; 567; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn 568; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval2 569; IS__CGSCC_NPM-SAME: () [[ATTR3]] { 570; IS__CGSCC_NPM-NEXT: [[C:%.*]] = call i8* @test_byval2() [[ATTR6:#.*]] 571; IS__CGSCC_NPM-NEXT: ret i8* [[C]] 572; 573 %c = call i8* @test_byval2(%struct.X* @S) 574 ret i8* %c 575} 576 577define void @fixpoint_changed(i32* %p) { 578; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind writeonly 579; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@fixpoint_changed 580; IS__TUNIT_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR4:#.*]] { 581; IS__TUNIT_OPM-NEXT: entry: 582; IS__TUNIT_OPM-NEXT: br label [[FOR_COND:%.*]] 583; IS__TUNIT_OPM: for.cond: 584; IS__TUNIT_OPM-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ] 585; IS__TUNIT_OPM-NEXT: [[CMP:%.*]] = icmp slt i32 [[J_0]], 30 586; IS__TUNIT_OPM-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 587; IS__TUNIT_OPM: for.body: 588; IS__TUNIT_OPM-NEXT: switch i32 [[J_0]], label [[SW_EPILOG]] [ 589; IS__TUNIT_OPM-NEXT: i32 1, label [[SW_BB:%.*]] 590; IS__TUNIT_OPM-NEXT: ] 591; IS__TUNIT_OPM: sw.bb: 592; IS__TUNIT_OPM-NEXT: br label [[SW_EPILOG]] 593; IS__TUNIT_OPM: sw.epilog: 594; IS__TUNIT_OPM-NEXT: [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ] 595; IS__TUNIT_OPM-NEXT: store i32 [[X_0]], i32* [[P]], align 4 596; IS__TUNIT_OPM-NEXT: [[INC]] = add nsw i32 [[J_0]], 1 597; IS__TUNIT_OPM-NEXT: br label [[FOR_COND]] 598; IS__TUNIT_OPM: for.end: 599; IS__TUNIT_OPM-NEXT: ret void 600; 601; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 602; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fixpoint_changed 603; IS__TUNIT_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR2]] { 604; IS__TUNIT_NPM-NEXT: entry: 605; IS__TUNIT_NPM-NEXT: br label [[FOR_COND:%.*]] 606; IS__TUNIT_NPM: for.cond: 607; IS__TUNIT_NPM-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ] 608; IS__TUNIT_NPM-NEXT: [[CMP:%.*]] = icmp slt i32 [[J_0]], 30 609; IS__TUNIT_NPM-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 610; IS__TUNIT_NPM: for.body: 611; IS__TUNIT_NPM-NEXT: switch i32 [[J_0]], label [[SW_EPILOG]] [ 612; IS__TUNIT_NPM-NEXT: i32 1, label [[SW_BB:%.*]] 613; IS__TUNIT_NPM-NEXT: ] 614; IS__TUNIT_NPM: sw.bb: 615; IS__TUNIT_NPM-NEXT: br label [[SW_EPILOG]] 616; IS__TUNIT_NPM: sw.epilog: 617; IS__TUNIT_NPM-NEXT: [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ] 618; IS__TUNIT_NPM-NEXT: store i32 [[X_0]], i32* [[P]], align 4 619; IS__TUNIT_NPM-NEXT: [[INC]] = add nsw i32 [[J_0]], 1 620; IS__TUNIT_NPM-NEXT: br label [[FOR_COND]] 621; IS__TUNIT_NPM: for.end: 622; IS__TUNIT_NPM-NEXT: ret void 623; 624; IS__CGSCC_OPM: Function Attrs: argmemonly nofree norecurse nosync nounwind writeonly 625; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@fixpoint_changed 626; IS__CGSCC_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR4:#.*]] { 627; IS__CGSCC_OPM-NEXT: entry: 628; IS__CGSCC_OPM-NEXT: br label [[FOR_COND:%.*]] 629; IS__CGSCC_OPM: for.cond: 630; IS__CGSCC_OPM-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ] 631; IS__CGSCC_OPM-NEXT: [[CMP:%.*]] = icmp slt i32 [[J_0]], 30 632; IS__CGSCC_OPM-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 633; IS__CGSCC_OPM: for.body: 634; IS__CGSCC_OPM-NEXT: switch i32 [[J_0]], label [[SW_EPILOG]] [ 635; IS__CGSCC_OPM-NEXT: i32 1, label [[SW_BB:%.*]] 636; IS__CGSCC_OPM-NEXT: ] 637; IS__CGSCC_OPM: sw.bb: 638; IS__CGSCC_OPM-NEXT: br label [[SW_EPILOG]] 639; IS__CGSCC_OPM: sw.epilog: 640; IS__CGSCC_OPM-NEXT: [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ] 641; IS__CGSCC_OPM-NEXT: store i32 [[X_0]], i32* [[P]], align 4 642; IS__CGSCC_OPM-NEXT: [[INC]] = add nsw i32 [[J_0]], 1 643; IS__CGSCC_OPM-NEXT: br label [[FOR_COND]] 644; IS__CGSCC_OPM: for.end: 645; IS__CGSCC_OPM-NEXT: ret void 646; 647; IS__CGSCC_NPM: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 648; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@fixpoint_changed 649; IS__CGSCC_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR2:#.*]] { 650; IS__CGSCC_NPM-NEXT: entry: 651; IS__CGSCC_NPM-NEXT: br label [[FOR_COND:%.*]] 652; IS__CGSCC_NPM: for.cond: 653; IS__CGSCC_NPM-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ] 654; IS__CGSCC_NPM-NEXT: [[CMP:%.*]] = icmp slt i32 [[J_0]], 30 655; IS__CGSCC_NPM-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 656; IS__CGSCC_NPM: for.body: 657; IS__CGSCC_NPM-NEXT: switch i32 [[J_0]], label [[SW_EPILOG]] [ 658; IS__CGSCC_NPM-NEXT: i32 1, label [[SW_BB:%.*]] 659; IS__CGSCC_NPM-NEXT: ] 660; IS__CGSCC_NPM: sw.bb: 661; IS__CGSCC_NPM-NEXT: br label [[SW_EPILOG]] 662; IS__CGSCC_NPM: sw.epilog: 663; IS__CGSCC_NPM-NEXT: [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ] 664; IS__CGSCC_NPM-NEXT: store i32 [[X_0]], i32* [[P]], align 4 665; IS__CGSCC_NPM-NEXT: [[INC]] = add nsw i32 [[J_0]], 1 666; IS__CGSCC_NPM-NEXT: br label [[FOR_COND]] 667; IS__CGSCC_NPM: for.end: 668; IS__CGSCC_NPM-NEXT: ret void 669; 670entry: 671 br label %for.cond 672 673for.cond: 674 %j.0 = phi i32 [ 0, %entry ], [ %inc, %sw.epilog ] 675 %cmp = icmp slt i32 %j.0, 30 676 br i1 %cmp, label %for.body, label %for.end 677 678for.body: 679 switch i32 %j.0, label %sw.epilog [ 680 i32 1, label %sw.bb 681 ] 682 683sw.bb: 684 br label %sw.epilog 685 686sw.epilog: 687 %x.0 = phi i32 [ 255, %for.body ], [ 253, %sw.bb ] 688 store i32 %x.0, i32* %p 689 %inc = add nsw i32 %j.0, 1 690 br label %for.cond 691 692for.end: 693 ret void 694} 695 696; Check we merge undef and a constant properly. 697define i8 @caller0() { 698; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 699; IS__TUNIT____-LABEL: define {{[^@]+}}@caller0 700; IS__TUNIT____-SAME: () [[ATTR1]] { 701; IS__TUNIT____-NEXT: ret i8 49 702; 703; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 704; IS__CGSCC____-LABEL: define {{[^@]+}}@caller0 705; IS__CGSCC____-SAME: () [[ATTR1]] { 706; IS__CGSCC____-NEXT: ret i8 49 707; 708 %c = call i8 @callee(i8 undef) 709 ret i8 %c 710} 711define i8 @caller1() { 712; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 713; IS__TUNIT____-LABEL: define {{[^@]+}}@caller1 714; IS__TUNIT____-SAME: () [[ATTR1]] { 715; IS__TUNIT____-NEXT: ret i8 49 716; 717; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 718; IS__CGSCC____-LABEL: define {{[^@]+}}@caller1 719; IS__CGSCC____-SAME: () [[ATTR1]] { 720; IS__CGSCC____-NEXT: ret i8 49 721; 722 %c = call i8 @callee(i8 undef) 723 ret i8 %c 724} 725define i8 @caller2() { 726; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 727; IS__TUNIT____-LABEL: define {{[^@]+}}@caller2 728; IS__TUNIT____-SAME: () [[ATTR1]] { 729; IS__TUNIT____-NEXT: ret i8 49 730; 731; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 732; IS__CGSCC____-LABEL: define {{[^@]+}}@caller2 733; IS__CGSCC____-SAME: () [[ATTR1]] { 734; IS__CGSCC____-NEXT: ret i8 49 735; 736 %c = call i8 @callee(i8 undef) 737 ret i8 %c 738} 739define i8 @caller_middle() { 740; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 741; IS__TUNIT____-LABEL: define {{[^@]+}}@caller_middle 742; IS__TUNIT____-SAME: () [[ATTR1]] { 743; IS__TUNIT____-NEXT: ret i8 49 744; 745; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 746; IS__CGSCC____-LABEL: define {{[^@]+}}@caller_middle 747; IS__CGSCC____-SAME: () [[ATTR1]] { 748; IS__CGSCC____-NEXT: ret i8 49 749; 750 %c = call i8 @callee(i8 42) 751 ret i8 %c 752} 753define i8 @caller3() { 754; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 755; IS__TUNIT____-LABEL: define {{[^@]+}}@caller3 756; IS__TUNIT____-SAME: () [[ATTR1]] { 757; IS__TUNIT____-NEXT: ret i8 49 758; 759; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 760; IS__CGSCC____-LABEL: define {{[^@]+}}@caller3 761; IS__CGSCC____-SAME: () [[ATTR1]] { 762; IS__CGSCC____-NEXT: ret i8 49 763; 764 %c = call i8 @callee(i8 undef) 765 ret i8 %c 766} 767define i8 @caller4() { 768; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 769; IS__TUNIT____-LABEL: define {{[^@]+}}@caller4 770; IS__TUNIT____-SAME: () [[ATTR1]] { 771; IS__TUNIT____-NEXT: ret i8 49 772; 773; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 774; IS__CGSCC____-LABEL: define {{[^@]+}}@caller4 775; IS__CGSCC____-SAME: () [[ATTR1]] { 776; IS__CGSCC____-NEXT: ret i8 49 777; 778 %c = call i8 @callee(i8 undef) 779 ret i8 %c 780} 781define internal i8 @callee(i8 %a) { 782; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 783; IS__CGSCC____-LABEL: define {{[^@]+}}@callee 784; IS__CGSCC____-SAME: () [[ATTR1]] { 785; IS__CGSCC____-NEXT: ret i8 undef 786; 787 %c = add i8 %a, 7 788 ret i8 %c 789} 790 791 792define i1 @icmp() { 793; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 794; IS__TUNIT____-LABEL: define {{[^@]+}}@icmp 795; IS__TUNIT____-SAME: () [[ATTR1]] { 796; IS__TUNIT____-NEXT: ret i1 true 797; 798; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 799; IS__CGSCC____-LABEL: define {{[^@]+}}@icmp 800; IS__CGSCC____-SAME: () [[ATTR1]] { 801; IS__CGSCC____-NEXT: ret i1 true 802; 803 %c = icmp eq i8* null, null 804 ret i1 %c 805} 806