1 ; RUN: opt -instsimplify -S < %s | FileCheck %s 2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 3 target triple = "x86_64-unknown-linux-gnu" 4 5 @g1 = global i32 0, align 4 6 @g2 = internal global i32 0, align 4 7 @g3 = unnamed_addr global i32 0, align 4 8 @g4 = hidden global i32 0, align 4 9 @g5 = protected global i32 0, align 4 10 @g6 = thread_local unnamed_addr global i32 0, align 4 11 12 ; Make sure we can simplify away a pointer comparison between 13 ; dynamically-allocated memory and a local stack allocation. 14 ; void p() 15 ; { 16 ; int *mData; 17 ; int mStackData[10]; 18 ; mData = new int[12]; 19 ; if (mData != mStackData) { 20 ; delete[] mData; 21 ; } 22 ; } 23 24 define void @_Z2p1v() #0 { 25 %mStackData = alloca [10 x i32], align 16 26 %1 = bitcast [10 x i32]* %mStackData to i8* 27 %2 = tail call noalias i8* @_Znam(i64 48) #4 28 %3 = bitcast i8* %2 to i32* 29 %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 30 %5 = icmp eq i32* %3, %4 31 br i1 %5, label %7, label %6 32 33 ; CHECK-LABEL: @_Z2p1v 34 ; CHECK-NOT: icmp 35 ; CHECK: ret void 36 37 ; <label>:6 ; preds = %0 38 call void @_ZdaPv(i8* %2) #5 39 br label %7 40 41 ; <label>:7 ; preds = %0, %6 42 ret void 43 } 44 45 ; Also check a more-complicated case with multiple underlying objects. 46 47 define void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 48 %mStackData = alloca [10 x i32], align 16 49 %1 = bitcast [10 x i32]* %mStackData to i8* 50 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 51 %3 = select i1 %b1, i32* %2, i32* @g2 52 %4 = tail call noalias i8* @_Znam(i64 48) #4 53 %5 = tail call noalias i8* @_Znam(i64 48) #4 54 %.v = select i1 %b2, i8* %4, i8* %5 55 %6 = bitcast i8* %.v to i32* 56 %7 = icmp eq i32* %6, %3 57 br i1 %7, label %9, label %8 58 59 ; CHECK-LABEL: @_Z2p2bb 60 ; CHECK-NOT: icmp 61 ; CHECK: ret void 62 63 ; <label>:8 ; preds = %0 64 call void @_ZdaPv(i8* %4) #5 65 call void @_ZdaPv(i8* %5) #5 66 br label %9 67 68 ; <label>:9 ; preds = %0, %8 69 ret void 70 } 71 72 define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 73 %mStackData = alloca [10 x i32], align 16 74 %1 = bitcast [10 x i32]* %mStackData to i8* 75 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 76 %3 = select i1 %b1, i32* %2, i32* @g3 77 %4 = tail call noalias i8* @_Znam(i64 48) #4 78 %5 = tail call noalias i8* @_Znam(i64 48) #4 79 %.v = select i1 %b2, i8* %4, i8* %5 80 %6 = bitcast i8* %.v to i32* 81 %7 = icmp eq i32* %6, %3 82 br i1 %7, label %9, label %8 83 84 ; CHECK-LABEL: @_Z2p4bb 85 ; CHECK-NOT: icmp 86 ; CHECK: ret void 87 88 ; <label>:8 ; preds = %0 89 call void @_ZdaPv(i8* %4) #5 90 call void @_ZdaPv(i8* %5) #5 91 br label %9 92 93 ; <label>:9 ; preds = %0, %8 94 ret void 95 } 96 97 define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 98 %mStackData = alloca [10 x i32], align 16 99 %1 = bitcast [10 x i32]* %mStackData to i8* 100 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 101 %3 = select i1 %b1, i32* %2, i32* @g4 102 %4 = tail call noalias i8* @_Znam(i64 48) #4 103 %5 = tail call noalias i8* @_Znam(i64 48) #4 104 %.v = select i1 %b2, i8* %4, i8* %5 105 %6 = bitcast i8* %.v to i32* 106 %7 = icmp eq i32* %6, %3 107 br i1 %7, label %9, label %8 108 109 ; CHECK-LABEL: @_Z2p5bb 110 ; CHECK-NOT: icmp 111 ; CHECK: ret void 112 113 ; <label>:8 ; preds = %0 114 call void @_ZdaPv(i8* %4) #5 115 call void @_ZdaPv(i8* %5) #5 116 br label %9 117 118 ; <label>:9 ; preds = %0, %8 119 ret void 120 } 121 122 define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 123 %mStackData = alloca [10 x i32], align 16 124 %1 = bitcast [10 x i32]* %mStackData to i8* 125 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 126 %3 = select i1 %b1, i32* %2, i32* @g5 127 %4 = tail call noalias i8* @_Znam(i64 48) #4 128 %5 = tail call noalias i8* @_Znam(i64 48) #4 129 %.v = select i1 %b2, i8* %4, i8* %5 130 %6 = bitcast i8* %.v to i32* 131 %7 = icmp eq i32* %6, %3 132 br i1 %7, label %9, label %8 133 134 ; CHECK-LABEL: @_Z2p6bb 135 ; CHECK-NOT: icmp 136 ; CHECK: ret void 137 138 ; <label>:8 ; preds = %0 139 call void @_ZdaPv(i8* %4) #5 140 call void @_ZdaPv(i8* %5) #5 141 br label %9 142 143 ; <label>:9 ; preds = %0, %8 144 ret void 145 } 146 147 ; Here's another case involving multiple underlying objects, but this time we 148 ; must keep the comparison (it might involve a regular pointer-typed function 149 ; argument). 150 151 define void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, i32* readnone %q) #0 { 152 %mStackData = alloca [10 x i32], align 16 153 %1 = bitcast [10 x i32]* %mStackData to i8* 154 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 155 %3 = select i1 %b1, i32* %2, i32* %q 156 %4 = tail call noalias i8* @_Znam(i64 48) #4 157 %5 = tail call noalias i8* @_Znam(i64 48) #4 158 %.v = select i1 %b2, i8* %4, i8* %5 159 %6 = bitcast i8* %.v to i32* 160 %7 = icmp eq i32* %6, %3 161 br i1 %7, label %9, label %8 162 163 ; CHECK-LABEL: @_Z4nopebbPi 164 ; CHECK: icmp 165 ; CHECK: ret void 166 167 ; <label>:8 ; preds = %0 168 call void @_ZdaPv(i8* %4) #5 169 call void @_ZdaPv(i8* %5) #5 170 br label %9 171 172 ; <label>:9 ; preds = %0, %8 173 ret void 174 } 175 176 define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 177 %mStackData = alloca [10 x i32], align 16 178 %1 = bitcast [10 x i32]* %mStackData to i8* 179 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 180 %3 = select i1 %b1, i32* %2, i32* @g1 181 %4 = tail call noalias i8* @_Znam(i64 48) #4 182 %5 = tail call noalias i8* @_Znam(i64 48) #4 183 %.v = select i1 %b2, i8* %4, i8* %5 184 %6 = bitcast i8* %.v to i32* 185 %7 = icmp eq i32* %6, %3 186 br i1 %7, label %9, label %8 187 188 ; CHECK-LABEL: @_Z2p3bb 189 ; CHECK: icmp 190 ; CHECK: ret void 191 192 ; <label>:8 ; preds = %0 193 call void @_ZdaPv(i8* %4) #5 194 call void @_ZdaPv(i8* %5) #5 195 br label %9 196 197 ; <label>:9 ; preds = %0, %8 198 ret void 199 } 200 201 define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) #0 { 202 %mStackData = alloca [10 x i32], align 16 203 %1 = bitcast [10 x i32]* %mStackData to i8* 204 %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 205 %3 = select i1 %b1, i32* %2, i32* @g6 206 %4 = tail call noalias i8* @_Znam(i64 48) #4 207 %5 = tail call noalias i8* @_Znam(i64 48) #4 208 %.v = select i1 %b2, i8* %4, i8* %5 209 %6 = bitcast i8* %.v to i32* 210 %7 = icmp eq i32* %6, %3 211 br i1 %7, label %9, label %8 212 213 ; CHECK-LABEL: @_Z2p7bb 214 ; CHECK: icmp 215 ; CHECK: ret void 216 217 ; <label>:8 ; preds = %0 218 call void @_ZdaPv(i8* %4) #5 219 call void @_ZdaPv(i8* %5) #5 220 br label %9 221 222 ; <label>:9 ; preds = %0, %8 223 ret void 224 } 225 226 define void @_Z2p2v(i32 %c) #0 { 227 %mStackData = alloca [10 x i32], i32 %c, align 16 228 %1 = bitcast [10 x i32]* %mStackData to i8* 229 %2 = tail call noalias i8* @_Znam(i64 48) #4 230 %3 = bitcast i8* %2 to i32* 231 %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0 232 %5 = icmp eq i32* %3, %4 233 br i1 %5, label %7, label %6 234 235 ; CHECK-LABEL: @_Z2p2v 236 ; CHECK: icmp 237 ; CHECK: ret void 238 239 ; <label>:6 ; preds = %0 240 call void @_ZdaPv(i8* %2) #5 241 br label %7 242 243 ; <label>:7 ; preds = %0, %6 244 ret void 245 } 246 247 ; Function Attrs: nobuiltin 248 declare noalias i8* @_Znam(i64) #2 249 250 ; Function Attrs: nobuiltin nounwind 251 declare void @_ZdaPv(i8*) #3 252 253 attributes #0 = { uwtable } 254 attributes #1 = { nounwind } 255 attributes #2 = { nobuiltin } 256 attributes #3 = { nobuiltin nounwind } 257 attributes #4 = { builtin } 258 attributes #5 = { builtin nounwind } 259 260