1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals 2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -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=2 -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:e-i64:64-f80:128-n8:16:32:64-S128" 8 9; Test cases specifically designed for the "undefined behavior" abstract function attribute. 10; We want to verify that whenever undefined behavior is assumed, the code becomes unreachable. 11; We use FIXME's to indicate problems and missing attributes. 12 13; -- Load tests -- 14 15define void @load_wholly_unreachable() { 16; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 17; IS__TUNIT____-LABEL: define {{[^@]+}}@load_wholly_unreachable 18; IS__TUNIT____-SAME: () #[[ATTR0:[0-9]+]] { 19; IS__TUNIT____-NEXT: unreachable 20; 21; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 22; IS__CGSCC____-LABEL: define {{[^@]+}}@load_wholly_unreachable 23; IS__CGSCC____-SAME: () #[[ATTR0:[0-9]+]] { 24; IS__CGSCC____-NEXT: unreachable 25; 26 %a = load i32, i32* null 27 ret void 28} 29 30define void @loads_wholly_unreachable() { 31; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 32; IS__TUNIT____-LABEL: define {{[^@]+}}@loads_wholly_unreachable 33; IS__TUNIT____-SAME: () #[[ATTR0]] { 34; IS__TUNIT____-NEXT: unreachable 35; 36; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 37; IS__CGSCC____-LABEL: define {{[^@]+}}@loads_wholly_unreachable 38; IS__CGSCC____-SAME: () #[[ATTR0]] { 39; IS__CGSCC____-NEXT: unreachable 40; 41 %a = load i32, i32* null 42 %b = load i32, i32* null 43 ret void 44} 45 46 47define void @load_single_bb_unreachable(i1 %cond) { 48; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 49; IS__TUNIT____-LABEL: define {{[^@]+}}@load_single_bb_unreachable 50; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 51; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 52; IS__TUNIT____: t: 53; IS__TUNIT____-NEXT: unreachable 54; IS__TUNIT____: e: 55; IS__TUNIT____-NEXT: ret void 56; 57; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 58; IS__CGSCC____-LABEL: define {{[^@]+}}@load_single_bb_unreachable 59; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 60; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 61; IS__CGSCC____: t: 62; IS__CGSCC____-NEXT: unreachable 63; IS__CGSCC____: e: 64; IS__CGSCC____-NEXT: ret void 65; 66 br i1 %cond, label %t, label %e 67t: 68 %b = load i32, i32* null 69 br label %e 70e: 71 ret void 72} 73 74; Note that while the load is removed (because it's unused), the block 75; is not changed to unreachable 76define void @load_null_pointer_is_defined() null_pointer_is_valid { 77; IS__TUNIT____: Function Attrs: nofree nosync nounwind null_pointer_is_valid readnone willreturn 78; IS__TUNIT____-LABEL: define {{[^@]+}}@load_null_pointer_is_defined 79; IS__TUNIT____-SAME: () #[[ATTR1:[0-9]+]] { 80; IS__TUNIT____-NEXT: ret void 81; 82; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid readnone willreturn 83; IS__CGSCC____-LABEL: define {{[^@]+}}@load_null_pointer_is_defined 84; IS__CGSCC____-SAME: () #[[ATTR1:[0-9]+]] { 85; IS__CGSCC____-NEXT: ret void 86; 87 %a = load i32, i32* null 88 ret void 89} 90 91define internal i32* @ret_null() { 92; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 93; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_null 94; IS__CGSCC____-SAME: () #[[ATTR0]] { 95; IS__CGSCC____-NEXT: ret i32* undef 96; 97 ret i32* null 98} 99 100define void @load_null_propagated() { 101; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 102; IS__TUNIT____-LABEL: define {{[^@]+}}@load_null_propagated 103; IS__TUNIT____-SAME: () #[[ATTR0]] { 104; IS__TUNIT____-NEXT: unreachable 105; 106; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 107; IS__CGSCC____-LABEL: define {{[^@]+}}@load_null_propagated 108; IS__CGSCC____-SAME: () #[[ATTR0]] { 109; IS__CGSCC____-NEXT: unreachable 110; 111 %ptr = call i32* @ret_null() 112 %a = load i32, i32* %ptr 113 ret void 114} 115 116; -- Store tests -- 117 118define void @store_wholly_unreachable() { 119; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 120; IS__TUNIT____-LABEL: define {{[^@]+}}@store_wholly_unreachable 121; IS__TUNIT____-SAME: () #[[ATTR0]] { 122; IS__TUNIT____-NEXT: unreachable 123; 124; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 125; IS__CGSCC____-LABEL: define {{[^@]+}}@store_wholly_unreachable 126; IS__CGSCC____-SAME: () #[[ATTR0]] { 127; IS__CGSCC____-NEXT: unreachable 128; 129 store i32 5, i32* null 130 ret void 131} 132 133define void @store_wholly_unreachable_volatile() { 134; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 135; IS__TUNIT____-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile 136; IS__TUNIT____-SAME: () #[[ATTR2:[0-9]+]] { 137; IS__TUNIT____-NEXT: store volatile i32 5, i32* null, align 4294967296 138; IS__TUNIT____-NEXT: ret void 139; 140; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 141; IS__CGSCC____-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile 142; IS__CGSCC____-SAME: () #[[ATTR2:[0-9]+]] { 143; IS__CGSCC____-NEXT: store volatile i32 5, i32* null, align 4294967296 144; IS__CGSCC____-NEXT: ret void 145; 146 store volatile i32 5, i32* null 147 ret void 148} 149 150define void @store_single_bb_unreachable(i1 %cond) { 151; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 152; IS__TUNIT____-LABEL: define {{[^@]+}}@store_single_bb_unreachable 153; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 154; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 155; IS__TUNIT____: t: 156; IS__TUNIT____-NEXT: unreachable 157; IS__TUNIT____: e: 158; IS__TUNIT____-NEXT: ret void 159; 160; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 161; IS__CGSCC____-LABEL: define {{[^@]+}}@store_single_bb_unreachable 162; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 163; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 164; IS__CGSCC____: t: 165; IS__CGSCC____-NEXT: unreachable 166; IS__CGSCC____: e: 167; IS__CGSCC____-NEXT: ret void 168; 169 br i1 %cond, label %t, label %e 170t: 171 store i32 5, i32* null 172 br label %e 173e: 174 ret void 175} 176 177define void @store_null_pointer_is_defined() null_pointer_is_valid { 178; IS__TUNIT____: Function Attrs: nofree nosync nounwind null_pointer_is_valid willreturn writeonly 179; IS__TUNIT____-LABEL: define {{[^@]+}}@store_null_pointer_is_defined 180; IS__TUNIT____-SAME: () #[[ATTR3:[0-9]+]] { 181; IS__TUNIT____-NEXT: store i32 5, i32* null, align 4294967296 182; IS__TUNIT____-NEXT: ret void 183; 184; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn writeonly 185; IS__CGSCC____-LABEL: define {{[^@]+}}@store_null_pointer_is_defined 186; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] { 187; IS__CGSCC____-NEXT: store i32 5, i32* null, align 4294967296 188; IS__CGSCC____-NEXT: ret void 189; 190 store i32 5, i32* null 191 ret void 192} 193 194define void @store_null_propagated() { 195; ATTRIBUTOR-LABEL: @store_null_propagated( 196; ATTRIBUTOR-NEXT: unreachable 197; 198; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 199; IS__TUNIT____-LABEL: define {{[^@]+}}@store_null_propagated 200; IS__TUNIT____-SAME: () #[[ATTR0]] { 201; IS__TUNIT____-NEXT: unreachable 202; 203; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 204; IS__CGSCC____-LABEL: define {{[^@]+}}@store_null_propagated 205; IS__CGSCC____-SAME: () #[[ATTR0]] { 206; IS__CGSCC____-NEXT: unreachable 207; 208 %ptr = call i32* @ret_null() 209 store i32 5, i32* %ptr 210 ret void 211} 212 213; -- AtomicRMW tests -- 214 215define void @atomicrmw_wholly_unreachable() { 216; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 217; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable 218; IS__TUNIT____-SAME: () #[[ATTR2]] { 219; IS__TUNIT____-NEXT: unreachable 220; 221; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 222; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable 223; IS__CGSCC____-SAME: () #[[ATTR2]] { 224; IS__CGSCC____-NEXT: unreachable 225; 226 %a = atomicrmw add i32* null, i32 1 acquire 227 ret void 228} 229 230define void @atomicrmw_single_bb_unreachable(i1 %cond) { 231; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 232; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable 233; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] { 234; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 235; IS__TUNIT____: t: 236; IS__TUNIT____-NEXT: unreachable 237; IS__TUNIT____: e: 238; IS__TUNIT____-NEXT: ret void 239; 240; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 241; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable 242; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] { 243; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 244; IS__CGSCC____: t: 245; IS__CGSCC____-NEXT: unreachable 246; IS__CGSCC____: e: 247; IS__CGSCC____-NEXT: ret void 248; 249 br i1 %cond, label %t, label %e 250t: 251 %a = atomicrmw add i32* null, i32 1 acquire 252 br label %e 253e: 254 ret void 255} 256 257define void @atomicrmw_null_pointer_is_defined() null_pointer_is_valid { 258; IS__TUNIT____: Function Attrs: nofree nounwind null_pointer_is_valid willreturn 259; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined 260; IS__TUNIT____-SAME: () #[[ATTR4:[0-9]+]] { 261; IS__TUNIT____-NEXT: [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire, align 4 262; IS__TUNIT____-NEXT: ret void 263; 264; IS__CGSCC____: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn 265; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined 266; IS__CGSCC____-SAME: () #[[ATTR4:[0-9]+]] { 267; IS__CGSCC____-NEXT: [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire, align 4 268; IS__CGSCC____-NEXT: ret void 269; 270 %a = atomicrmw add i32* null, i32 1 acquire 271 ret void 272} 273 274define void @atomicrmw_null_propagated() { 275; ATTRIBUTOR-LABEL: @atomicrmw_null_propagated( 276; ATTRIBUTOR-NEXT: unreachable 277; 278; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 279; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_null_propagated 280; IS__TUNIT____-SAME: () #[[ATTR2]] { 281; IS__TUNIT____-NEXT: unreachable 282; 283; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 284; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_null_propagated 285; IS__CGSCC____-SAME: () #[[ATTR2]] { 286; IS__CGSCC____-NEXT: unreachable 287; 288 %ptr = call i32* @ret_null() 289 %a = atomicrmw add i32* %ptr, i32 1 acquire 290 ret void 291} 292 293; -- AtomicCmpXchg tests -- 294 295define void @atomiccmpxchg_wholly_unreachable() { 296; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 297; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable 298; IS__TUNIT____-SAME: () #[[ATTR2]] { 299; IS__TUNIT____-NEXT: unreachable 300; 301; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 302; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable 303; IS__CGSCC____-SAME: () #[[ATTR2]] { 304; IS__CGSCC____-NEXT: unreachable 305; 306 %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic 307 ret void 308} 309 310define void @atomiccmpxchg_single_bb_unreachable(i1 %cond) { 311; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 312; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable 313; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] { 314; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 315; IS__TUNIT____: t: 316; IS__TUNIT____-NEXT: unreachable 317; IS__TUNIT____: e: 318; IS__TUNIT____-NEXT: ret void 319; 320; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 321; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable 322; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] { 323; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] 324; IS__CGSCC____: t: 325; IS__CGSCC____-NEXT: unreachable 326; IS__CGSCC____: e: 327; IS__CGSCC____-NEXT: ret void 328; 329 br i1 %cond, label %t, label %e 330t: 331 %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic 332 br label %e 333e: 334 ret void 335} 336 337define void @atomiccmpxchg_null_pointer_is_defined() null_pointer_is_valid { 338; IS__TUNIT____: Function Attrs: nofree nounwind null_pointer_is_valid willreturn 339; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined 340; IS__TUNIT____-SAME: () #[[ATTR4]] { 341; IS__TUNIT____-NEXT: [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic, align 4 342; IS__TUNIT____-NEXT: ret void 343; 344; IS__CGSCC____: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn 345; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined 346; IS__CGSCC____-SAME: () #[[ATTR4]] { 347; IS__CGSCC____-NEXT: [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic, align 4 348; IS__CGSCC____-NEXT: ret void 349; 350 %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic 351 ret void 352} 353 354define void @atomiccmpxchg_null_propagated() { 355; ATTRIBUTOR-LABEL: @atomiccmpxchg_null_propagated( 356; ATTRIBUTOR-NEXT: unreachable 357; 358; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn 359; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated 360; IS__TUNIT____-SAME: () #[[ATTR2]] { 361; IS__TUNIT____-NEXT: unreachable 362; 363; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn 364; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated 365; IS__CGSCC____-SAME: () #[[ATTR2]] { 366; IS__CGSCC____-NEXT: unreachable 367; 368 %ptr = call i32* @ret_null() 369 %a = cmpxchg i32* %ptr, i32 2, i32 3 acq_rel monotonic 370 ret void 371} 372 373; -- Conditional branching tests -- 374 375; Note: The unreachable on %t and %e is _not_ from AAUndefinedBehavior 376 377define i32 @cond_br_on_undef() { 378; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn 379; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef 380; IS__TUNIT____-SAME: () #[[ATTR5:[0-9]+]] { 381; IS__TUNIT____-NEXT: unreachable 382; IS__TUNIT____: t: 383; IS__TUNIT____-NEXT: unreachable 384; IS__TUNIT____: e: 385; IS__TUNIT____-NEXT: unreachable 386; 387; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn 388; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef 389; IS__CGSCC____-SAME: () #[[ATTR5:[0-9]+]] { 390; IS__CGSCC____-NEXT: unreachable 391; IS__CGSCC____: t: 392; IS__CGSCC____-NEXT: unreachable 393; IS__CGSCC____: e: 394; IS__CGSCC____-NEXT: unreachable 395; 396 br i1 undef, label %t, label %e 397t: 398 ret i32 1 399e: 400 ret i32 2 401} 402 403; More complicated branching 404 ; Valid branch - verify that this is not converted 405 ; to unreachable. 406define void @cond_br_on_undef2(i1 %cond) { 407; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 408; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef2 409; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 410; IS__TUNIT____-NEXT: br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]] 411; IS__TUNIT____: t1: 412; IS__TUNIT____-NEXT: unreachable 413; IS__TUNIT____: t2: 414; IS__TUNIT____-NEXT: unreachable 415; IS__TUNIT____: e2: 416; IS__TUNIT____-NEXT: unreachable 417; IS__TUNIT____: e1: 418; IS__TUNIT____-NEXT: ret void 419; 420; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 421; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef2 422; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] { 423; IS__CGSCC____-NEXT: br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]] 424; IS__CGSCC____: t1: 425; IS__CGSCC____-NEXT: unreachable 426; IS__CGSCC____: t2: 427; IS__CGSCC____-NEXT: unreachable 428; IS__CGSCC____: e2: 429; IS__CGSCC____-NEXT: unreachable 430; IS__CGSCC____: e1: 431; IS__CGSCC____-NEXT: ret void 432; 433 br i1 %cond, label %t1, label %e1 434t1: 435 br i1 undef, label %t2, label %e2 436t2: 437 ret void 438e2: 439 ret void 440e1: 441 ret void 442} 443 444define i1 @ret_undef() { 445; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 446; IS__TUNIT____-LABEL: define {{[^@]+}}@ret_undef 447; IS__TUNIT____-SAME: () #[[ATTR0]] { 448; IS__TUNIT____-NEXT: ret i1 undef 449; 450; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 451; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_undef 452; IS__CGSCC____-SAME: () #[[ATTR0]] { 453; IS__CGSCC____-NEXT: ret i1 undef 454; 455 ret i1 undef 456} 457 458define void @cond_br_on_undef_interproc() { 459; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn 460; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc 461; IS__TUNIT____-SAME: () #[[ATTR5]] { 462; IS__TUNIT____-NEXT: unreachable 463; IS__TUNIT____: t: 464; IS__TUNIT____-NEXT: unreachable 465; IS__TUNIT____: e: 466; IS__TUNIT____-NEXT: unreachable 467; 468; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn 469; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc 470; IS__CGSCC____-SAME: () #[[ATTR5]] { 471; IS__CGSCC____-NEXT: unreachable 472; IS__CGSCC____: t: 473; IS__CGSCC____-NEXT: unreachable 474; IS__CGSCC____: e: 475; IS__CGSCC____-NEXT: unreachable 476; 477 %cond = call i1 @ret_undef() 478 br i1 %cond, label %t, label %e 479t: 480 ret void 481e: 482 ret void 483} 484 485define i1 @ret_undef2() { 486; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 487; IS__TUNIT____-LABEL: define {{[^@]+}}@ret_undef2 488; IS__TUNIT____-SAME: () #[[ATTR0]] { 489; IS__TUNIT____-NEXT: br i1 true, label [[T:%.*]], label [[E:%.*]] 490; IS__TUNIT____: t: 491; IS__TUNIT____-NEXT: ret i1 undef 492; IS__TUNIT____: e: 493; IS__TUNIT____-NEXT: unreachable 494; 495; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 496; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_undef2 497; IS__CGSCC____-SAME: () #[[ATTR0]] { 498; IS__CGSCC____-NEXT: br i1 true, label [[T:%.*]], label [[E:%.*]] 499; IS__CGSCC____: t: 500; IS__CGSCC____-NEXT: ret i1 undef 501; IS__CGSCC____: e: 502; IS__CGSCC____-NEXT: unreachable 503; 504 br i1 true, label %t, label %e 505t: 506 ret i1 undef 507e: 508 ret i1 undef 509} 510 511; More complicated interproc deduction of undef 512define void @cond_br_on_undef_interproc2() { 513; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn 514; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2 515; IS__TUNIT____-SAME: () #[[ATTR5]] { 516; IS__TUNIT____-NEXT: unreachable 517; IS__TUNIT____: t: 518; IS__TUNIT____-NEXT: unreachable 519; IS__TUNIT____: e: 520; IS__TUNIT____-NEXT: unreachable 521; 522; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn 523; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2 524; IS__CGSCC____-SAME: () #[[ATTR5]] { 525; IS__CGSCC____-NEXT: unreachable 526; IS__CGSCC____: t: 527; IS__CGSCC____-NEXT: unreachable 528; IS__CGSCC____: e: 529; IS__CGSCC____-NEXT: unreachable 530; 531 %cond = call i1 @ret_undef2() 532 br i1 %cond, label %t, label %e 533t: 534 ret void 535e: 536 ret void 537} 538 539; Branch on undef that depends on propagation of 540; undef of a previous instruction. 541define i32 @cond_br_on_undef3() { 542; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 543; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef3 544; IS__TUNIT____-SAME: () #[[ATTR0]] { 545; IS__TUNIT____-NEXT: br label [[T:%.*]] 546; IS__TUNIT____: t: 547; IS__TUNIT____-NEXT: ret i32 1 548; IS__TUNIT____: e: 549; IS__TUNIT____-NEXT: unreachable 550; 551; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 552; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef3 553; IS__CGSCC____-SAME: () #[[ATTR0]] { 554; IS__CGSCC____-NEXT: br label [[T:%.*]] 555; IS__CGSCC____: t: 556; IS__CGSCC____-NEXT: ret i32 1 557; IS__CGSCC____: e: 558; IS__CGSCC____-NEXT: unreachable 559; 560 %cond = icmp ne i32 1, undef 561 br i1 %cond, label %t, label %e 562t: 563 ret i32 1 564e: 565 ret i32 2 566} 567 568; Branch on undef because of uninitialized value. 569; FIXME: Currently it doesn't propagate the undef. 570define i32 @cond_br_on_undef_uninit() { 571; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn 572; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit 573; IS__TUNIT____-SAME: () #[[ATTR5]] { 574; IS__TUNIT____-NEXT: unreachable 575; IS__TUNIT____: t: 576; IS__TUNIT____-NEXT: unreachable 577; IS__TUNIT____: e: 578; IS__TUNIT____-NEXT: unreachable 579; 580; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn 581; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit 582; IS__CGSCC____-SAME: () #[[ATTR5]] { 583; IS__CGSCC____-NEXT: unreachable 584; IS__CGSCC____: t: 585; IS__CGSCC____-NEXT: unreachable 586; IS__CGSCC____: e: 587; IS__CGSCC____-NEXT: unreachable 588; 589 %alloc = alloca i1 590 %cond = load i1, i1* %alloc 591 br i1 %cond, label %t, label %e 592t: 593 ret i32 1 594e: 595 ret i32 2 596} 597 598; Note that the `load` has UB (so it will be changed to unreachable) 599; and the branch is a terminator that can be constant-folded. 600; We want to test that doing both won't cause a segfault. 601; MODULE-NOT: @callee( 602define internal i32 @callee(i1 %C, i32* %A) { 603; 604; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 605; IS__CGSCC____-LABEL: define {{[^@]+}}@callee 606; IS__CGSCC____-SAME: () #[[ATTR0]] { 607; IS__CGSCC____-NEXT: entry: 608; IS__CGSCC____-NEXT: unreachable 609; IS__CGSCC____: T: 610; IS__CGSCC____-NEXT: unreachable 611; IS__CGSCC____: F: 612; IS__CGSCC____-NEXT: ret i32 undef 613; 614entry: 615 %A.0 = load i32, i32* null 616 br i1 %C, label %T, label %F 617 618T: 619 ret i32 %A.0 620 621F: 622 ret i32 1 623} 624 625define i32 @foo() { 626; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 627; IS__TUNIT____-LABEL: define {{[^@]+}}@foo 628; IS__TUNIT____-SAME: () #[[ATTR0]] { 629; IS__TUNIT____-NEXT: ret i32 1 630; 631; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 632; IS__CGSCC____-LABEL: define {{[^@]+}}@foo 633; IS__CGSCC____-SAME: () #[[ATTR0]] { 634; IS__CGSCC____-NEXT: ret i32 1 635; 636 %X = call i32 @callee(i1 false, i32* null) 637 ret i32 %X 638} 639 640; Tests for nonnull noundef attribute violation. 641; 642; Tests for argument position 643 644define void @arg_nonnull_1(i32* nonnull %a) { 645; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 646; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_1 647; IS__TUNIT____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6:[0-9]+]] { 648; IS__TUNIT____-NEXT: store i32 0, i32* [[A]], align 4 649; IS__TUNIT____-NEXT: ret void 650; 651; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 652; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_1 653; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6:[0-9]+]] { 654; IS__CGSCC____-NEXT: store i32 0, i32* [[A]], align 4 655; IS__CGSCC____-NEXT: ret void 656; 657 store i32 0, i32* %a 658 ret void 659} 660 661define void @arg_nonnull_1_noundef_1(i32* nonnull noundef %a) { 662; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 663; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1 664; IS__TUNIT____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6]] { 665; IS__TUNIT____-NEXT: store i32 0, i32* [[A]], align 4 666; IS__TUNIT____-NEXT: ret void 667; 668; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 669; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1 670; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6]] { 671; IS__CGSCC____-NEXT: store i32 0, i32* [[A]], align 4 672; IS__CGSCC____-NEXT: ret void 673; 674 store i32 0, i32* %a 675 ret void 676} 677 678define void @arg_nonnull_12(i32* nonnull %a, i32* nonnull %b, i32* %c) { 679; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 680; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_12 681; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] { 682; IS__TUNIT____-NEXT: [[D:%.*]] = icmp eq i32* [[C]], null 683; IS__TUNIT____-NEXT: br i1 [[D]], label [[T:%.*]], label [[F:%.*]] 684; IS__TUNIT____: t: 685; IS__TUNIT____-NEXT: store i32 0, i32* [[A]], align 4 686; IS__TUNIT____-NEXT: br label [[RET:%.*]] 687; IS__TUNIT____: f: 688; IS__TUNIT____-NEXT: store i32 1, i32* [[B]], align 4 689; IS__TUNIT____-NEXT: br label [[RET]] 690; IS__TUNIT____: ret: 691; IS__TUNIT____-NEXT: ret void 692; 693; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 694; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_12 695; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] { 696; IS__CGSCC____-NEXT: [[D:%.*]] = icmp eq i32* [[C]], null 697; IS__CGSCC____-NEXT: br i1 [[D]], label [[T:%.*]], label [[F:%.*]] 698; IS__CGSCC____: t: 699; IS__CGSCC____-NEXT: store i32 0, i32* [[A]], align 4 700; IS__CGSCC____-NEXT: br label [[RET:%.*]] 701; IS__CGSCC____: f: 702; IS__CGSCC____-NEXT: store i32 1, i32* [[B]], align 4 703; IS__CGSCC____-NEXT: br label [[RET]] 704; IS__CGSCC____: ret: 705; IS__CGSCC____-NEXT: ret void 706; 707 %d = icmp eq i32* %c, null 708 br i1 %d, label %t, label %f 709t: 710 store i32 0, i32* %a 711 br label %ret 712f: 713 store i32 1, i32* %b 714 br label %ret 715ret: 716 ret void 717} 718 719define void @arg_nonnull_12_noundef_2(i32* nonnull %a, i32* noundef nonnull %b, i32* %c) { 720; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly 721; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2 722; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree noundef nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] { 723; IS__TUNIT____-NEXT: [[D:%.*]] = icmp eq i32* [[C]], null 724; IS__TUNIT____-NEXT: br i1 [[D]], label [[T:%.*]], label [[F:%.*]] 725; IS__TUNIT____: t: 726; IS__TUNIT____-NEXT: store i32 0, i32* [[A]], align 4 727; IS__TUNIT____-NEXT: br label [[RET:%.*]] 728; IS__TUNIT____: f: 729; IS__TUNIT____-NEXT: store i32 1, i32* [[B]], align 4 730; IS__TUNIT____-NEXT: br label [[RET]] 731; IS__TUNIT____: ret: 732; IS__TUNIT____-NEXT: ret void 733; 734; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly 735; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2 736; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree noundef nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] { 737; IS__CGSCC____-NEXT: [[D:%.*]] = icmp eq i32* [[C]], null 738; IS__CGSCC____-NEXT: br i1 [[D]], label [[T:%.*]], label [[F:%.*]] 739; IS__CGSCC____: t: 740; IS__CGSCC____-NEXT: store i32 0, i32* [[A]], align 4 741; IS__CGSCC____-NEXT: br label [[RET:%.*]] 742; IS__CGSCC____: f: 743; IS__CGSCC____-NEXT: store i32 1, i32* [[B]], align 4 744; IS__CGSCC____-NEXT: br label [[RET]] 745; IS__CGSCC____: ret: 746; IS__CGSCC____-NEXT: ret void 747; 748 %d = icmp eq i32* %c, null 749 br i1 %d, label %t, label %f 750t: 751 store i32 0, i32* %a 752 br label %ret 753f: 754 store i32 1, i32* %b 755 br label %ret 756ret: 757 ret void 758} 759 760; Pass null directly to argument with nonnull attribute 761define void @arg_nonnull_violation1_1() { 762; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 763; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1 764; IS__TUNIT____-SAME: () #[[ATTR0]] { 765; IS__TUNIT____-NEXT: unreachable 766; 767; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 768; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1 769; IS__CGSCC____-SAME: () #[[ATTR0]] { 770; IS__CGSCC____-NEXT: unreachable 771; 772 call void @arg_nonnull_1(i32* null) 773 ret void 774} 775 776define void @arg_nonnull_violation1_2() { 777; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 778; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2 779; IS__TUNIT____-SAME: () #[[ATTR0]] { 780; IS__TUNIT____-NEXT: unreachable 781; 782; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 783; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2 784; IS__CGSCC____-SAME: () #[[ATTR0]] { 785; IS__CGSCC____-NEXT: unreachable 786; 787 call void @arg_nonnull_1_noundef_1(i32* null) 788 ret void 789} 790 791; A case that depends on value simplification 792define void @arg_nonnull_violation2_1(i1 %c) { 793; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 794; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1 795; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 796; IS__TUNIT____-NEXT: unreachable 797; 798; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 799; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1 800; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 801; IS__CGSCC____-NEXT: unreachable 802; 803 %null = getelementptr i32, i32* null, i32 0 804 %mustnull = select i1 %c, i32* null, i32* %null 805 call void @arg_nonnull_1(i32* %mustnull) 806 ret void 807} 808 809define void @arg_nonnull_violation2_2(i1 %c) { 810; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 811; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2 812; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 813; IS__TUNIT____-NEXT: unreachable 814; 815; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 816; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2 817; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 818; IS__CGSCC____-NEXT: unreachable 819; 820 %null = getelementptr i32, i32* null, i32 0 821 %mustnull = select i1 %c, i32* null, i32* %null 822 call void @arg_nonnull_1_noundef_1(i32* %mustnull) 823 ret void 824} 825 826; Cases for single and multiple violation at a callsite 827define void @arg_nonnull_violation3_1(i1 %c) { 828; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 829; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1 830; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 831; IS__TUNIT____-NEXT: [[PTR:%.*]] = alloca i32, align 4 832; IS__TUNIT____-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] 833; IS__TUNIT____: t: 834; IS__TUNIT____-NEXT: call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7:[0-9]+]] 835; IS__TUNIT____-NEXT: call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]] 836; IS__TUNIT____-NEXT: unreachable 837; IS__TUNIT____: f: 838; IS__TUNIT____-NEXT: unreachable 839; IS__TUNIT____: ret: 840; IS__TUNIT____-NEXT: ret void 841; 842; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 843; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1 844; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 845; IS__CGSCC____-NEXT: [[PTR:%.*]] = alloca i32, align 4 846; IS__CGSCC____-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] 847; IS__CGSCC____: t: 848; IS__CGSCC____-NEXT: call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7:[0-9]+]] 849; IS__CGSCC____-NEXT: call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]] 850; IS__CGSCC____-NEXT: unreachable 851; IS__CGSCC____: f: 852; IS__CGSCC____-NEXT: unreachable 853; IS__CGSCC____: ret: 854; IS__CGSCC____-NEXT: ret void 855; 856 %ptr = alloca i32 857 br i1 %c, label %t, label %f 858t: 859 call void @arg_nonnull_12(i32* %ptr, i32* %ptr, i32* %ptr) 860 call void @arg_nonnull_12(i32* %ptr, i32* %ptr, i32* null) 861 call void @arg_nonnull_12(i32* %ptr, i32* null, i32* %ptr) 862 call void @arg_nonnull_12(i32* %ptr, i32* null, i32* null) 863 br label %ret 864f: 865 call void @arg_nonnull_12(i32* null, i32* %ptr, i32* %ptr) 866 call void @arg_nonnull_12(i32* null, i32* %ptr, i32* null) 867 call void @arg_nonnull_12(i32* null, i32* null, i32* %ptr) 868 call void @arg_nonnull_12(i32* null, i32* null, i32* null) 869 br label %ret 870ret: 871 ret void 872} 873 874define void @arg_nonnull_violation3_2(i1 %c) { 875; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 876; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2 877; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 878; IS__TUNIT____-NEXT: [[PTR:%.*]] = alloca i32, align 4 879; IS__TUNIT____-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] 880; IS__TUNIT____: t: 881; IS__TUNIT____-NEXT: call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7]] 882; IS__TUNIT____-NEXT: call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]] 883; IS__TUNIT____-NEXT: unreachable 884; IS__TUNIT____: f: 885; IS__TUNIT____-NEXT: unreachable 886; IS__TUNIT____: ret: 887; IS__TUNIT____-NEXT: ret void 888; 889; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 890; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2 891; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { 892; IS__CGSCC____-NEXT: [[PTR:%.*]] = alloca i32, align 4 893; IS__CGSCC____-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] 894; IS__CGSCC____: t: 895; IS__CGSCC____-NEXT: call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7]] 896; IS__CGSCC____-NEXT: call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]] 897; IS__CGSCC____-NEXT: unreachable 898; IS__CGSCC____: f: 899; IS__CGSCC____-NEXT: unreachable 900; IS__CGSCC____: ret: 901; IS__CGSCC____-NEXT: ret void 902; 903 %ptr = alloca i32 904 br i1 %c, label %t, label %f 905t: 906 call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* %ptr, i32* %ptr) 907 call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* %ptr, i32* null) 908 call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* null, i32* %ptr) 909 call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* null, i32* null) 910 br label %ret 911f: 912 call void @arg_nonnull_12_noundef_2(i32* null, i32* %ptr, i32* %ptr) 913 call void @arg_nonnull_12_noundef_2(i32* null, i32* %ptr, i32* null) 914 call void @arg_nonnull_12_noundef_2(i32* null, i32* null, i32* %ptr) 915 call void @arg_nonnull_12_noundef_2(i32* null, i32* null, i32* null) 916 br label %ret 917ret: 918 ret void 919} 920 921; Tests for returned position 922 923define nonnull i32* @returned_nonnnull(i32 %c) { 924; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 925; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull 926; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 927; IS__TUNIT____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 928; IS__TUNIT____-NEXT: i32 0, label [[ONZERO:%.*]] 929; IS__TUNIT____-NEXT: i32 1, label [[ONONE:%.*]] 930; IS__TUNIT____-NEXT: ] 931; IS__TUNIT____: onzero: 932; IS__TUNIT____-NEXT: [[PTR:%.*]] = alloca i32, align 4 933; IS__TUNIT____-NEXT: ret i32* [[PTR]] 934; IS__TUNIT____: onone: 935; IS__TUNIT____-NEXT: ret i32* null 936; IS__TUNIT____: ondefault: 937; IS__TUNIT____-NEXT: ret i32* undef 938; 939; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 940; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull 941; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 942; IS__CGSCC____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 943; IS__CGSCC____-NEXT: i32 0, label [[ONZERO:%.*]] 944; IS__CGSCC____-NEXT: i32 1, label [[ONONE:%.*]] 945; IS__CGSCC____-NEXT: ] 946; IS__CGSCC____: onzero: 947; IS__CGSCC____-NEXT: [[PTR:%.*]] = alloca i32, align 4 948; IS__CGSCC____-NEXT: ret i32* [[PTR]] 949; IS__CGSCC____: onone: 950; IS__CGSCC____-NEXT: ret i32* null 951; IS__CGSCC____: ondefault: 952; IS__CGSCC____-NEXT: ret i32* undef 953; 954 switch i32 %c, label %ondefault [ i32 0, label %onzero 955 i32 1, label %onone ] 956onzero: 957 %ptr = alloca i32 958 ret i32* %ptr 959onone: 960 ret i32* null 961ondefault: 962 ret i32* undef 963} 964 965define noundef i32* @returned_noundef(i32 %c) { 966; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 967; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_noundef 968; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 969; IS__TUNIT____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 970; IS__TUNIT____-NEXT: i32 0, label [[ONZERO:%.*]] 971; IS__TUNIT____-NEXT: i32 1, label [[ONONE:%.*]] 972; IS__TUNIT____-NEXT: ] 973; IS__TUNIT____: onzero: 974; IS__TUNIT____-NEXT: [[PTR:%.*]] = alloca i32, align 4 975; IS__TUNIT____-NEXT: ret i32* [[PTR]] 976; IS__TUNIT____: onone: 977; IS__TUNIT____-NEXT: ret i32* null 978; IS__TUNIT____: ondefault: 979; IS__TUNIT____-NEXT: unreachable 980; 981; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 982; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_noundef 983; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 984; IS__CGSCC____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 985; IS__CGSCC____-NEXT: i32 0, label [[ONZERO:%.*]] 986; IS__CGSCC____-NEXT: i32 1, label [[ONONE:%.*]] 987; IS__CGSCC____-NEXT: ] 988; IS__CGSCC____: onzero: 989; IS__CGSCC____-NEXT: [[PTR:%.*]] = alloca i32, align 4 990; IS__CGSCC____-NEXT: ret i32* [[PTR]] 991; IS__CGSCC____: onone: 992; IS__CGSCC____-NEXT: ret i32* null 993; IS__CGSCC____: ondefault: 994; IS__CGSCC____-NEXT: unreachable 995; 996 switch i32 %c, label %ondefault [ i32 0, label %onzero 997 i32 1, label %onone ] 998onzero: 999 %ptr = alloca i32 1000 ret i32* %ptr 1001onone: 1002 ret i32* null 1003ondefault: 1004 ret i32* undef 1005} 1006 1007define nonnull noundef i32* @returned_nonnnull_noundef(i32 %c) { 1008; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1009; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef 1010; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 1011; IS__TUNIT____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 1012; IS__TUNIT____-NEXT: i32 0, label [[ONZERO:%.*]] 1013; IS__TUNIT____-NEXT: i32 1, label [[ONONE:%.*]] 1014; IS__TUNIT____-NEXT: ] 1015; IS__TUNIT____: onzero: 1016; IS__TUNIT____-NEXT: [[PTR:%.*]] = alloca i32, align 4 1017; IS__TUNIT____-NEXT: ret i32* [[PTR]] 1018; IS__TUNIT____: onone: 1019; IS__TUNIT____-NEXT: unreachable 1020; IS__TUNIT____: ondefault: 1021; IS__TUNIT____-NEXT: unreachable 1022; 1023; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1024; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef 1025; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { 1026; IS__CGSCC____-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ 1027; IS__CGSCC____-NEXT: i32 0, label [[ONZERO:%.*]] 1028; IS__CGSCC____-NEXT: i32 1, label [[ONONE:%.*]] 1029; IS__CGSCC____-NEXT: ] 1030; IS__CGSCC____: onzero: 1031; IS__CGSCC____-NEXT: [[PTR:%.*]] = alloca i32, align 4 1032; IS__CGSCC____-NEXT: ret i32* [[PTR]] 1033; IS__CGSCC____: onone: 1034; IS__CGSCC____-NEXT: unreachable 1035; IS__CGSCC____: ondefault: 1036; IS__CGSCC____-NEXT: unreachable 1037; 1038 switch i32 %c, label %ondefault [ i32 0, label %onzero 1039 i32 1, label %onone ] 1040onzero: 1041 %ptr = alloca i32 1042 ret i32* %ptr 1043onone: 1044 ret i32* null 1045ondefault: 1046 ret i32* undef 1047} 1048 1049define noundef i32 @returned_nonnnull_noundef_int() { 1050; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1051; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef_int 1052; IS__TUNIT____-SAME: () #[[ATTR0]] { 1053; IS__TUNIT____-NEXT: ret i32 0 1054; 1055; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1056; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef_int 1057; IS__CGSCC____-SAME: () #[[ATTR0]] { 1058; IS__CGSCC____-NEXT: ret i32 0 1059; 1060 ret i32 0 1061} 1062 1063declare void @callee_int_arg(i32) 1064 1065define void @callsite_noundef_1() { 1066; CHECK-LABEL: define {{[^@]+}}@callsite_noundef_1() { 1067; CHECK-NEXT: call void @callee_int_arg(i32 noundef 0) 1068; CHECK-NEXT: ret void 1069; 1070 call void @callee_int_arg(i32 noundef 0) 1071 ret void 1072} 1073 1074declare void @callee_ptr_arg(i32*) 1075 1076define void @callsite_noundef_2() { 1077; CHECK-LABEL: define {{[^@]+}}@callsite_noundef_2() { 1078; CHECK-NEXT: unreachable 1079; 1080 call void @callee_ptr_arg(i32* noundef undef) 1081 ret void 1082} 1083 1084define i32 @argument_noundef1(i32 noundef %c) { 1085; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1086; IS__TUNIT____-LABEL: define {{[^@]+}}@argument_noundef1 1087; IS__TUNIT____-SAME: (i32 noundef returned [[C:%.*]]) #[[ATTR0]] { 1088; IS__TUNIT____-NEXT: ret i32 [[C]] 1089; 1090; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1091; IS__CGSCC____-LABEL: define {{[^@]+}}@argument_noundef1 1092; IS__CGSCC____-SAME: (i32 noundef returned [[C:%.*]]) #[[ATTR0]] { 1093; IS__CGSCC____-NEXT: ret i32 [[C]] 1094; 1095 ret i32 %c 1096} 1097 1098define i32 @violate_noundef_nonpointer() { 1099; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1100; IS__TUNIT____-LABEL: define {{[^@]+}}@violate_noundef_nonpointer 1101; IS__TUNIT____-SAME: () #[[ATTR0]] { 1102; IS__TUNIT____-NEXT: ret i32 undef 1103; 1104; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1105; IS__CGSCC____-LABEL: define {{[^@]+}}@violate_noundef_nonpointer 1106; IS__CGSCC____-SAME: () #[[ATTR0]] { 1107; IS__CGSCC____-NEXT: ret i32 undef 1108; 1109 %ret = call i32 @argument_noundef1(i32 undef) 1110 ret i32 %ret 1111} 1112 1113define i32* @argument_noundef2(i32* noundef %c) { 1114; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1115; IS__TUNIT____-LABEL: define {{[^@]+}}@argument_noundef2 1116; IS__TUNIT____-SAME: (i32* nofree noundef readnone returned "no-capture-maybe-returned" [[C:%.*]]) #[[ATTR0]] { 1117; IS__TUNIT____-NEXT: ret i32* [[C]] 1118; 1119; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1120; IS__CGSCC____-LABEL: define {{[^@]+}}@argument_noundef2 1121; IS__CGSCC____-SAME: (i32* nofree noundef readnone returned "no-capture-maybe-returned" [[C:%.*]]) #[[ATTR0]] { 1122; IS__CGSCC____-NEXT: ret i32* [[C]] 1123; 1124 ret i32* %c 1125} 1126 1127define i32* @violate_noundef_pointer() { 1128; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn 1129; IS__TUNIT____-LABEL: define {{[^@]+}}@violate_noundef_pointer 1130; IS__TUNIT____-SAME: () #[[ATTR0]] { 1131; IS__TUNIT____-NEXT: ret i32* undef 1132; 1133; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 1134; IS__CGSCC____-LABEL: define {{[^@]+}}@violate_noundef_pointer 1135; IS__CGSCC____-SAME: () #[[ATTR0]] { 1136; IS__CGSCC____-NEXT: ret i32* undef 1137; 1138 %ret = call i32* @argument_noundef2(i32* undef) 1139 ret i32* %ret 1140} 1141;. 1142; IS__TUNIT____: attributes #[[ATTR0]] = { nofree nosync nounwind readnone willreturn } 1143; IS__TUNIT____: attributes #[[ATTR1]] = { nofree nosync nounwind null_pointer_is_valid readnone willreturn } 1144; IS__TUNIT____: attributes #[[ATTR2]] = { nofree nounwind readnone willreturn } 1145; IS__TUNIT____: attributes #[[ATTR3]] = { nofree nosync nounwind null_pointer_is_valid willreturn writeonly } 1146; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nounwind null_pointer_is_valid willreturn } 1147; IS__TUNIT____: attributes #[[ATTR5]] = { nofree noreturn nosync nounwind readnone willreturn } 1148; IS__TUNIT____: attributes #[[ATTR6]] = { argmemonly nofree nosync nounwind willreturn writeonly } 1149; IS__TUNIT____: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn writeonly } 1150;. 1151; IS__CGSCC____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn } 1152; IS__CGSCC____: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind null_pointer_is_valid readnone willreturn } 1153; IS__CGSCC____: attributes #[[ATTR2]] = { nofree norecurse nounwind readnone willreturn } 1154; IS__CGSCC____: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn writeonly } 1155; IS__CGSCC____: attributes #[[ATTR4]] = { nofree norecurse nounwind null_pointer_is_valid willreturn } 1156; IS__CGSCC____: attributes #[[ATTR5]] = { nofree norecurse noreturn nosync nounwind readnone willreturn } 1157; IS__CGSCC____: attributes #[[ATTR6]] = { argmemonly nofree norecurse nosync nounwind willreturn writeonly } 1158; IS__CGSCC____: attributes #[[ATTR7]] = { nounwind willreturn writeonly } 1159;. 1160