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() { 26; CHECK-LABEL: @_Z2p1v( 27; CHECK-NEXT: bb: 28; CHECK-NEXT: [[I1:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2:[0-9]+]] 29; CHECK-NEXT: br i1 false, label [[BB6:%.*]], label [[BB5:%.*]] 30; CHECK: bb5: 31; CHECK-NEXT: call void @_ZdaPv(ptr [[I1]]) #[[ATTR3:[0-9]+]] 32; CHECK-NEXT: br label [[BB6]] 33; CHECK: bb6: 34; CHECK-NEXT: ret void 35; 36bb: 37 %mStackData = alloca [10 x i32], align 16 38 %i1 = tail call noalias ptr @_Znam(i64 48) #3 39 %i4 = icmp eq ptr %i1, %mStackData 40 br i1 %i4, label %bb6, label %bb5 41 42bb5: ; preds = %bb 43 call void @_ZdaPv(ptr %i1) #4 44 br label %bb6 45 46bb6: ; preds = %bb5, %bb 47 ret void 48} 49 50define void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) { 51; CHECK-LABEL: @_Z2p2bb( 52; CHECK-NEXT: bb: 53; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 54; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 55; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]] 56; CHECK: bb7: 57; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 58; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 59; CHECK-NEXT: br label [[BB8]] 60; CHECK: bb8: 61; CHECK-NEXT: ret void 62; 63bb: 64 %mStackData = alloca [10 x i32], align 16 65 %i2 = select i1 %b1, ptr %mStackData, ptr @g2 66 %i3 = tail call noalias ptr @_Znam(i64 48) #3 67 %i4 = tail call noalias ptr @_Znam(i64 48) #3 68 %.v = select i1 %b2, ptr %i3, ptr %i4 69 %i6 = icmp eq ptr %.v, %i2 70 br i1 %i6, label %bb8, label %bb7 71 72bb7: ; preds = %bb 73 call void @_ZdaPv(ptr %i3) #4 74 call void @_ZdaPv(ptr %i4) #4 75 br label %bb8 76 77bb8: ; preds = %bb7, %bb 78 ret void 79} 80 81define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) { 82; CHECK-LABEL: @_Z2p4bb( 83; CHECK-NEXT: bb: 84; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 85; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 86; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]] 87; CHECK: bb7: 88; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 89; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 90; CHECK-NEXT: br label [[BB8]] 91; CHECK: bb8: 92; CHECK-NEXT: ret void 93; 94bb: 95 %mStackData = alloca [10 x i32], align 16 96 %i2 = select i1 %b1, ptr %mStackData, ptr @g3 97 %i3 = tail call noalias ptr @_Znam(i64 48) #3 98 %i4 = tail call noalias ptr @_Znam(i64 48) #3 99 %.v = select i1 %b2, ptr %i3, ptr %i4 100 %i6 = icmp eq ptr %.v, %i2 101 br i1 %i6, label %bb8, label %bb7 102 103bb7: ; preds = %bb 104 call void @_ZdaPv(ptr %i3) #4 105 call void @_ZdaPv(ptr %i4) #4 106 br label %bb8 107 108bb8: ; preds = %bb7, %bb 109 ret void 110} 111 112define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) { 113; CHECK-LABEL: @_Z2p5bb( 114; CHECK-NEXT: bb: 115; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 116; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 117; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]] 118; CHECK: bb7: 119; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 120; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 121; CHECK-NEXT: br label [[BB8]] 122; CHECK: bb8: 123; CHECK-NEXT: ret void 124; 125bb: 126 %mStackData = alloca [10 x i32], align 16 127 %i2 = select i1 %b1, ptr %mStackData, ptr @g4 128 %i3 = tail call noalias ptr @_Znam(i64 48) #3 129 %i4 = tail call noalias ptr @_Znam(i64 48) #3 130 %.v = select i1 %b2, ptr %i3, ptr %i4 131 %i6 = icmp eq ptr %.v, %i2 132 br i1 %i6, label %bb8, label %bb7 133 134bb7: ; preds = %bb 135 call void @_ZdaPv(ptr %i3) #4 136 call void @_ZdaPv(ptr %i4) #4 137 br label %bb8 138 139bb8: ; preds = %bb7, %bb 140 ret void 141} 142 143define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) { 144; CHECK-LABEL: @_Z2p6bb( 145; CHECK-NEXT: bb: 146; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 147; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 148; CHECK-NEXT: br i1 false, label [[BB8:%.*]], label [[BB7:%.*]] 149; CHECK: bb7: 150; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 151; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 152; CHECK-NEXT: br label [[BB8]] 153; CHECK: bb8: 154; CHECK-NEXT: ret void 155; 156bb: 157 %mStackData = alloca [10 x i32], align 16 158 %i2 = select i1 %b1, ptr %mStackData, ptr @g5 159 %i3 = tail call noalias ptr @_Znam(i64 48) #3 160 %i4 = tail call noalias ptr @_Znam(i64 48) #3 161 %.v = select i1 %b2, ptr %i3, ptr %i4 162 %i6 = icmp eq ptr %.v, %i2 163 br i1 %i6, label %bb8, label %bb7 164 165bb7: ; preds = %bb 166 call void @_ZdaPv(ptr %i3) #4 167 call void @_ZdaPv(ptr %i4) #4 168 br label %bb8 169 170bb8: ; preds = %bb7, %bb 171 ret void 172} 173 174define void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, ptr readnone %q) { 175; CHECK-LABEL: @_Z4nopebbPi( 176; CHECK-NEXT: bb: 177; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 178; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr [[Q:%.*]] 179; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 180; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 181; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]] 182; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]] 183; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]] 184; CHECK: bb7: 185; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 186; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 187; CHECK-NEXT: br label [[BB8]] 188; CHECK: bb8: 189; CHECK-NEXT: ret void 190; 191bb: 192 %mStackData = alloca [10 x i32], align 16 193 %i2 = select i1 %b1, ptr %mStackData, ptr %q 194 %i3 = tail call noalias ptr @_Znam(i64 48) #3 195 %i4 = tail call noalias ptr @_Znam(i64 48) #3 196 %.v = select i1 %b2, ptr %i3, ptr %i4 197 %i6 = icmp eq ptr %.v, %i2 198 br i1 %i6, label %bb8, label %bb7 199 200bb7: ; preds = %bb 201 call void @_ZdaPv(ptr %i3) #4 202 call void @_ZdaPv(ptr %i4) #4 203 br label %bb8 204 205bb8: ; preds = %bb7, %bb 206 ret void 207} 208 209define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) { 210; CHECK-LABEL: @_Z2p3bb( 211; CHECK-NEXT: bb: 212; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 213; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr @g1 214; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 215; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 216; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]] 217; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]] 218; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]] 219; CHECK: bb7: 220; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 221; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 222; CHECK-NEXT: br label [[BB8]] 223; CHECK: bb8: 224; CHECK-NEXT: ret void 225; 226bb: 227 %mStackData = alloca [10 x i32], align 16 228 %i2 = select i1 %b1, ptr %mStackData, ptr @g1 229 %i3 = tail call noalias ptr @_Znam(i64 48) #3 230 %i4 = tail call noalias ptr @_Znam(i64 48) #3 231 %.v = select i1 %b2, ptr %i3, ptr %i4 232 %i6 = icmp eq ptr %.v, %i2 233 br i1 %i6, label %bb8, label %bb7 234 235bb7: ; preds = %bb 236 call void @_ZdaPv(ptr %i3) #4 237 call void @_ZdaPv(ptr %i4) #4 238 br label %bb8 239 240bb8: ; preds = %bb7, %bb 241 ret void 242} 243 244define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) { 245; CHECK-LABEL: @_Z2p7bb( 246; CHECK-NEXT: bb: 247; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16 248; CHECK-NEXT: [[I2:%.*]] = select i1 [[B1:%.*]], ptr [[MSTACKDATA]], ptr @g6 249; CHECK-NEXT: [[I3:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 250; CHECK-NEXT: [[I4:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 251; CHECK-NEXT: [[DOTV:%.*]] = select i1 [[B2:%.*]], ptr [[I3]], ptr [[I4]] 252; CHECK-NEXT: [[I6:%.*]] = icmp eq ptr [[DOTV]], [[I2]] 253; CHECK-NEXT: br i1 [[I6]], label [[BB8:%.*]], label [[BB7:%.*]] 254; CHECK: bb7: 255; CHECK-NEXT: call void @_ZdaPv(ptr [[I3]]) #[[ATTR3]] 256; CHECK-NEXT: call void @_ZdaPv(ptr [[I4]]) #[[ATTR3]] 257; CHECK-NEXT: br label [[BB8]] 258; CHECK: bb8: 259; CHECK-NEXT: ret void 260; 261bb: 262 %mStackData = alloca [10 x i32], align 16 263 %i2 = select i1 %b1, ptr %mStackData, ptr @g6 264 %i3 = tail call noalias ptr @_Znam(i64 48) #3 265 %i4 = tail call noalias ptr @_Znam(i64 48) #3 266 %.v = select i1 %b2, ptr %i3, ptr %i4 267 %i6 = icmp eq ptr %.v, %i2 268 br i1 %i6, label %bb8, label %bb7 269 270bb7: ; preds = %bb 271 call void @_ZdaPv(ptr %i3) #4 272 call void @_ZdaPv(ptr %i4) #4 273 br label %bb8 274 275bb8: ; preds = %bb7, %bb 276 ret void 277} 278 279define void @_Z2p2v(i32 %c) { 280; CHECK-LABEL: @_Z2p2v( 281; CHECK-NEXT: bb: 282; CHECK-NEXT: [[MSTACKDATA:%.*]] = alloca [10 x i32], i32 [[C:%.*]], align 16 283; CHECK-NEXT: [[I1:%.*]] = tail call noalias ptr @_Znam(i64 48) #[[ATTR2]] 284; CHECK-NEXT: [[I4:%.*]] = icmp eq ptr [[I1]], [[MSTACKDATA]] 285; CHECK-NEXT: br i1 [[I4]], label [[BB6:%.*]], label [[BB5:%.*]] 286; CHECK: bb5: 287; CHECK-NEXT: call void @_ZdaPv(ptr [[I1]]) #[[ATTR3]] 288; CHECK-NEXT: br label [[BB6]] 289; CHECK: bb6: 290; CHECK-NEXT: ret void 291; 292bb: 293 %mStackData = alloca [10 x i32], i32 %c, align 16 294 %i1 = tail call noalias ptr @_Znam(i64 48) #3 295 %i4 = icmp eq ptr %i1, %mStackData 296 br i1 %i4, label %bb6, label %bb5 297 298bb5: ; preds = %bb 299 call void @_ZdaPv(ptr %i1) #4 300 br label %bb6 301 302bb6: ; preds = %bb5, %bb 303 ret void 304} 305 306; Function Attrs: nobuiltin 307declare noalias ptr @_Znam(i64) #1 308 309; Function Attrs: nobuiltin nounwind 310declare void @_ZdaPv(ptr) #2 311 312attributes #1 = { nobuiltin } 313attributes #2 = { nobuiltin nounwind } 314attributes #3 = { builtin } 315attributes #4 = { builtin nounwind } 316