1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4target triple = "x86_64-unknown-linux-gnu" 5 6@g1 = global i32 0, align 4 7@g2 = internal global i32 0, align 4 8@g3 = unnamed_addr global i32 0, align 4 9@g4 = hidden global i32 0, align 4 10@g5 = protected global i32 0, align 4 11@g6 = thread_local unnamed_addr global i32 0, align 4 12 13; Make sure we can simplify away a pointer comparison between 14; dynamically-allocated memory and a local stack allocation. 15; void p() 16; { 17; int *mData; 18; int mStackData[10]; 19; mData = new int[12]; 20; if (mData != mStackData) { 21; delete[] mData; 22; } 23; } 24 25define void @_Z2p1v() #0 { 26; CHECK-LABEL: @_Z2p1v( 27; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3:[0-9]+]] 28; CHECK-NEXT: br i1 false, label [[TMP3:%.*]], label [[TMP2:%.*]] 29; CHECK: 2: 30; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4:[0-9]+]] 31; CHECK-NEXT: br label [[TMP3]] 32; CHECK: 3: 33; CHECK-NEXT: ret void 34; 35 %mStackData = alloca [10 x i32], align 16 36 %1 = bitcast [10 x i32]* %mStackData to i8* 37 %2 = tail call noalias i8* @_Znam(i64 48) #4 38 %3 = bitcast i8* %2 to i32* 39 %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 40 %5 = icmp eq i32* %3, %4 41 br i1 %5, label %7, label %6 42 43 44; <label>:6 ; preds = %0 45 call void @_ZdaPv(i8* %2) #5 46 br label %7 47 48; <label>:7 ; preds = %0, %6 49 ret void 50} 51 52; Also check a more-complicated case with multiple underlying objects. 53 54define void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 55; CHECK-LABEL: @_Z2p2bb( 56; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 57; CHECK-NEXT: [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 58; CHECK-NEXT: br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]] 59; CHECK: 3: 60; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]] 61; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]] 62; CHECK-NEXT: br label [[TMP4]] 63; CHECK: 4: 64; CHECK-NEXT: ret void 65; 66 %mStackData = alloca [10 x i32], align 16 67 %1 = bitcast [10 x i32]* %mStackData to i8* 68 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 69 %3 = select i1 %b1, i32* %2, i32* @g2 70 %4 = tail call noalias i8* @_Znam(i64 48) #4 71 %5 = tail call noalias i8* @_Znam(i64 48) #4 72 %.v = select i1 %b2, i8* %4, i8* %5 73 %6 = bitcast i8* %.v to i32* 74 %7 = icmp eq i32* %6, %3 75 br i1 %7, label %9, label %8 76 77 78; <label>:8 ; preds = %0 79 call void @_ZdaPv(i8* %4) #5 80 call void @_ZdaPv(i8* %5) #5 81 br label %9 82 83; <label>:9 ; preds = %0, %8 84 ret void 85} 86 87define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 88; CHECK-LABEL: @_Z2p4bb( 89; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 90; CHECK-NEXT: [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 91; CHECK-NEXT: br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]] 92; CHECK: 3: 93; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]] 94; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]] 95; CHECK-NEXT: br label [[TMP4]] 96; CHECK: 4: 97; CHECK-NEXT: ret void 98; 99 %mStackData = alloca [10 x i32], align 16 100 %1 = bitcast [10 x i32]* %mStackData to i8* 101 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 102 %3 = select i1 %b1, i32* %2, i32* @g3 103 %4 = tail call noalias i8* @_Znam(i64 48) #4 104 %5 = tail call noalias i8* @_Znam(i64 48) #4 105 %.v = select i1 %b2, i8* %4, i8* %5 106 %6 = bitcast i8* %.v to i32* 107 %7 = icmp eq i32* %6, %3 108 br i1 %7, label %9, label %8 109 110 111; <label>:8 ; preds = %0 112 call void @_ZdaPv(i8* %4) #5 113 call void @_ZdaPv(i8* %5) #5 114 br label %9 115 116; <label>:9 ; preds = %0, %8 117 ret void 118} 119 120define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 121; CHECK-LABEL: @_Z2p5bb( 122; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 123; CHECK-NEXT: [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 124; CHECK-NEXT: br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]] 125; CHECK: 3: 126; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]] 127; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]] 128; CHECK-NEXT: br label [[TMP4]] 129; CHECK: 4: 130; CHECK-NEXT: ret void 131; 132 %mStackData = alloca [10 x i32], align 16 133 %1 = bitcast [10 x i32]* %mStackData to i8* 134 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 135 %3 = select i1 %b1, i32* %2, i32* @g4 136 %4 = tail call noalias i8* @_Znam(i64 48) #4 137 %5 = tail call noalias i8* @_Znam(i64 48) #4 138 %.v = select i1 %b2, i8* %4, i8* %5 139 %6 = bitcast i8* %.v to i32* 140 %7 = icmp eq i32* %6, %3 141 br i1 %7, label %9, label %8 142 143 144; <label>:8 ; preds = %0 145 call void @_ZdaPv(i8* %4) #5 146 call void @_ZdaPv(i8* %5) #5 147 br label %9 148 149; <label>:9 ; preds = %0, %8 150 ret void 151} 152 153define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 154; CHECK-LABEL: @_Z2p6bb( 155; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 156; CHECK-NEXT: [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 157; CHECK-NEXT: br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]] 158; CHECK: 3: 159; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]] 160; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]] 161; CHECK-NEXT: br label [[TMP4]] 162; CHECK: 4: 163; CHECK-NEXT: ret void 164; 165 %mStackData = alloca [10 x i32], align 16 166 %1 = bitcast [10 x i32]* %mStackData to i8* 167 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 168 %3 = select i1 %b1, i32* %2, i32* @g5 169 %4 = tail call noalias i8* @_Znam(i64 48) #4 170 %5 = tail call noalias i8* @_Znam(i64 48) #4 171 %.v = select i1 %b2, i8* %4, i8* %5 172 %6 = bitcast i8* %.v to i32* 173 %7 = icmp eq i32* %6, %3 174 br i1 %7, label %9, label %8 175 176 177; <label>:8 ; preds = %0 178 call void @_ZdaPv(i8* %4) #5 179 call void @_ZdaPv(i8* %5) #5 180 br label %9 181 182; <label>:9 ; preds = %0, %8 183 ret void 184} 185 186; Here's another case involving multiple underlying objects, but this time we 187; must keep the comparison (it might involve a regular pointer-typed function 188; argument). 189 190define void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, i32* readnone %q) #0 { 191; CHECK-LABEL: @_Z4nopebbPi( 192; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 193; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0 194; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* [[Q:%.*]] 195; CHECK-NEXT: [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 196; CHECK-NEXT: [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 197; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]] 198; CHECK-NEXT: [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32* 199; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]] 200; CHECK-NEXT: br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]] 201; CHECK: 7: 202; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]] 203; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]] 204; CHECK-NEXT: br label [[TMP8]] 205; CHECK: 8: 206; CHECK-NEXT: ret void 207; 208 %mStackData = alloca [10 x i32], align 16 209 %1 = bitcast [10 x i32]* %mStackData to i8* 210 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 211 %3 = select i1 %b1, i32* %2, i32* %q 212 %4 = tail call noalias i8* @_Znam(i64 48) #4 213 %5 = tail call noalias i8* @_Znam(i64 48) #4 214 %.v = select i1 %b2, i8* %4, i8* %5 215 %6 = bitcast i8* %.v to i32* 216 %7 = icmp eq i32* %6, %3 217 br i1 %7, label %9, label %8 218 219 220; <label>:8 ; preds = %0 221 call void @_ZdaPv(i8* %4) #5 222 call void @_ZdaPv(i8* %5) #5 223 br label %9 224 225; <label>:9 ; preds = %0, %8 226 ret void 227} 228 229define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 230; CHECK-LABEL: @_Z2p3bb( 231; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 232; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0 233; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* @g1 234; CHECK-NEXT: [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 235; CHECK-NEXT: [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 236; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]] 237; CHECK-NEXT: [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32* 238; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]] 239; CHECK-NEXT: br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]] 240; CHECK: 7: 241; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]] 242; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]] 243; CHECK-NEXT: br label [[TMP8]] 244; CHECK: 8: 245; CHECK-NEXT: ret void 246; 247 %mStackData = alloca [10 x i32], align 16 248 %1 = bitcast [10 x i32]* %mStackData to i8* 249 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 250 %3 = select i1 %b1, i32* %2, i32* @g1 251 %4 = tail call noalias i8* @_Znam(i64 48) #4 252 %5 = tail call noalias i8* @_Znam(i64 48) #4 253 %.v = select i1 %b2, i8* %4, i8* %5 254 %6 = bitcast i8* %.v to i32* 255 %7 = icmp eq i32* %6, %3 256 br i1 %7, label %9, label %8 257 258 259; <label>:8 ; preds = %0 260 call void @_ZdaPv(i8* %4) #5 261 call void @_ZdaPv(i8* %5) #5 262 br label %9 263 264; <label>:9 ; preds = %0, %8 265 ret void 266} 267 268define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 269; CHECK-LABEL: @_Z2p7bb( 270; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 271; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0 272; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* @g6 273; CHECK-NEXT: [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 274; CHECK-NEXT: [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 275; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]] 276; CHECK-NEXT: [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32* 277; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]] 278; CHECK-NEXT: br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]] 279; CHECK: 7: 280; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]] 281; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]] 282; CHECK-NEXT: br label [[TMP8]] 283; CHECK: 8: 284; CHECK-NEXT: ret void 285; 286 %mStackData = alloca [10 x i32], align 16 287 %1 = bitcast [10 x i32]* %mStackData to i8* 288 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 289 %3 = select i1 %b1, i32* %2, i32* @g6 290 %4 = tail call noalias i8* @_Znam(i64 48) #4 291 %5 = tail call noalias i8* @_Znam(i64 48) #4 292 %.v = select i1 %b2, i8* %4, i8* %5 293 %6 = bitcast i8* %.v to i32* 294 %7 = icmp eq i32* %6, %3 295 br i1 %7, label %9, label %8 296 297 298; <label>:8 ; preds = %0 299 call void @_ZdaPv(i8* %4) #5 300 call void @_ZdaPv(i8* %5) #5 301 br label %9 302 303; <label>:9 ; preds = %0, %8 304 ret void 305} 306 307define void @_Z2p2v(i32 %c) #0 { 308; CHECK-LABEL: @_Z2p2v( 309; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], i32 [[C:%.*]], align 16 310; CHECK-NEXT: [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]] 311; CHECK-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32* 312; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0 313; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32* [[TMP2]], [[TMP3]] 314; CHECK-NEXT: br i1 [[TMP4]], label [[TMP6:%.*]], label [[TMP5:%.*]] 315; CHECK: 5: 316; CHECK-NEXT: call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]] 317; CHECK-NEXT: br label [[TMP6]] 318; CHECK: 6: 319; CHECK-NEXT: ret void 320; 321 %mStackData = alloca [10 x i32], i32 %c, align 16 322 %1 = bitcast [10 x i32]* %mStackData to i8* 323 %2 = tail call noalias i8* @_Znam(i64 48) #4 324 %3 = bitcast i8* %2 to i32* 325 %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 326 %5 = icmp eq i32* %3, %4 327 br i1 %5, label %7, label %6 328 329 330; <label>:6 ; preds = %0 331 call void @_ZdaPv(i8* %2) #5 332 br label %7 333 334; <label>:7 ; preds = %0, %6 335 ret void 336} 337 338; Function Attrs: nobuiltin 339declare noalias i8* @_Znam(i64) #2 340 341; Function Attrs: nobuiltin nounwind 342declare void @_ZdaPv(i8*) #3 343 344attributes #0 = { uwtable } 345attributes #1 = { nounwind } 346attributes #2 = { nobuiltin } 347attributes #3 = { nobuiltin nounwind } 348attributes #4 = { builtin } 349attributes #5 = { builtin nounwind } 350 351