14173ed13SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 24173ed13SFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s 34173ed13SFlorian Hahn 44173ed13SFlorian Hahntarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 54173ed13SFlorian Hahn 64173ed13SFlorian Hahn%struct.Foo = type { [32000 x i32], [32000 x i32] } 74173ed13SFlorian Hahn 84173ed13SFlorian Hahn@foo = global %struct.Foo zeroinitializer, align 4 94173ed13SFlorian Hahn 104173ed13SFlorian Hahndefine void @accesses_to_struct_dereferenceable(ptr noalias %dst) { 114173ed13SFlorian Hahn; CHECK-LABEL: define void @accesses_to_struct_dereferenceable 124173ed13SFlorian Hahn; CHECK-SAME: (ptr noalias [[DST:%.*]]) { 134173ed13SFlorian Hahn; CHECK-NEXT: entry: 144173ed13SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 154173ed13SFlorian Hahn; CHECK: vector.ph: 164173ed13SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 174173ed13SFlorian Hahn; CHECK: vector.body: 180d61ffd3SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 194173ed13SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 204173ed13SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[TMP0]] 214173ed13SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 224173ed13SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 234173ed13SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = icmp ult <4 x i32> [[WIDE_LOAD]], zeroinitializer 24*38fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true) 25*38fffa63SPaul Walker; CHECK-NEXT: [[TMP5:%.*]] = getelementptr [[STRUCT_FOO:%.*]], ptr @foo, i64 0, i32 1, i64 [[TMP0]] 26*38fffa63SPaul Walker; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr [[TMP5]], i32 0 27*38fffa63SPaul Walker; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr [[TMP6]], align 4 28*38fffa63SPaul Walker; CHECK-NEXT: [[TMP7:%.*]] = getelementptr [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[TMP0]] 29*38fffa63SPaul Walker; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[TMP7]], i32 0 30*38fffa63SPaul Walker; CHECK-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr [[TMP8]], align 4 31*38fffa63SPaul Walker; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i32> [[WIDE_LOAD1]], <4 x i32> [[WIDE_LOAD2]] 320d61ffd3SFlorian Hahn; CHECK-NEXT: store <4 x i32> [[PREDPHI]], ptr [[TMP2]], align 4 334173ed13SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 340d61ffd3SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 32000 350d61ffd3SFlorian Hahn; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 364173ed13SFlorian Hahn; CHECK: middle.block: 3796e83d37SFlorian Hahn; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]] 384173ed13SFlorian Hahn; CHECK: scalar.ph: 394173ed13SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 32000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 404173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 414173ed13SFlorian Hahn; CHECK: loop.header: 424173ed13SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 434173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]] 444173ed13SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[GEP_DST]], align 4 454173ed13SFlorian Hahn; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[D]], 0 464173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 474173ed13SFlorian Hahn; CHECK: if.then: 484173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[IV]] 494173ed13SFlorian Hahn; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4 504173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 514173ed13SFlorian Hahn; CHECK: if.else: 524173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[IV]] 534173ed13SFlorian Hahn; CHECK-NEXT: [[L_B:%.*]] = load i32, ptr [[GEP_B]], align 4 544173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 554173ed13SFlorian Hahn; CHECK: loop.latch: 564173ed13SFlorian Hahn; CHECK-NEXT: [[TMP_0:%.*]] = phi i32 [ [[L_A]], [[IF_THEN]] ], [ [[L_B]], [[IF_ELSE]] ] 574173ed13SFlorian Hahn; CHECK-NEXT: store i32 [[TMP_0]], ptr [[GEP_DST]], align 4 584173ed13SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 594173ed13SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 32000 604173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP3:![0-9]+]] 614173ed13SFlorian Hahn; CHECK: exit: 624173ed13SFlorian Hahn; CHECK-NEXT: ret void 634173ed13SFlorian Hahn; 644173ed13SFlorian Hahnentry: 654173ed13SFlorian Hahn br label %loop.header 664173ed13SFlorian Hahn 674173ed13SFlorian Hahnloop.header: 684173ed13SFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 694173ed13SFlorian Hahn %gep.dst = getelementptr inbounds i32, ptr %dst, i64 %iv 704173ed13SFlorian Hahn %d = load i32, ptr %gep.dst, align 4 714173ed13SFlorian Hahn %cmp3 = icmp ult i32 %d, 0 724173ed13SFlorian Hahn br i1 %cmp3, label %if.then, label %if.else 734173ed13SFlorian Hahn 744173ed13SFlorian Hahnif.then: 754173ed13SFlorian Hahn %gep.a = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 0, i64 %iv 764173ed13SFlorian Hahn %l.a = load i32, ptr %gep.a, align 4 774173ed13SFlorian Hahn br label %loop.latch 784173ed13SFlorian Hahn 794173ed13SFlorian Hahnif.else: 804173ed13SFlorian Hahn %gep.b = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 1, i64 %iv 814173ed13SFlorian Hahn %l.b = load i32, ptr %gep.b, align 4 824173ed13SFlorian Hahn br label %loop.latch 834173ed13SFlorian Hahn 844173ed13SFlorian Hahnloop.latch: 854173ed13SFlorian Hahn %tmp.0 = phi i32 [ %l.a, %if.then ], [ %l.b, %if.else ] 864173ed13SFlorian Hahn store i32 %tmp.0, ptr %gep.dst, align 4 874173ed13SFlorian Hahn %iv.next = add nuw nsw i64 %iv, 1 884173ed13SFlorian Hahn %exitcond.not = icmp eq i64 %iv.next, 32000 894173ed13SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.header 904173ed13SFlorian Hahn 914173ed13SFlorian Hahnexit: 924173ed13SFlorian Hahn ret void 934173ed13SFlorian Hahn} 944173ed13SFlorian Hahn 954173ed13SFlorian Hahndefine void @accesses_to_struct_may_not_be_dereferenceable_due_to_loop_bound(ptr noalias %dst) { 964173ed13SFlorian Hahn; CHECK-LABEL: define void @accesses_to_struct_may_not_be_dereferenceable_due_to_loop_bound 974173ed13SFlorian Hahn; CHECK-SAME: (ptr noalias [[DST:%.*]]) { 984173ed13SFlorian Hahn; CHECK-NEXT: entry: 994173ed13SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1004173ed13SFlorian Hahn; CHECK: vector.ph: 1014173ed13SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1024173ed13SFlorian Hahn; CHECK: vector.body: 1034173ed13SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 1044173ed13SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 1054173ed13SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[TMP0]] 1064173ed13SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 1074173ed13SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 1084173ed13SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = icmp ult <4 x i32> [[WIDE_LOAD]], zeroinitializer 109*38fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true) 1104173ed13SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0 1114173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP5]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 1124173ed13SFlorian Hahn; CHECK: pred.load.if: 1134173ed13SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_FOO:%.*]], ptr @foo, i64 0, i32 1, i64 [[TMP0]] 1144173ed13SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4 1154173ed13SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = insertelement <4 x i32> poison, i32 [[TMP7]], i32 0 1164173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 1174173ed13SFlorian Hahn; CHECK: pred.load.continue: 1184173ed13SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP8]], [[PRED_LOAD_IF]] ] 1194173ed13SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1 1204173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 1214173ed13SFlorian Hahn; CHECK: pred.load.if1: 1224173ed13SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], 1 1234173ed13SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP11]] 1244173ed13SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4 1254173ed13SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i32> [[TMP9]], i32 [[TMP13]], i32 1 1264173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 1274173ed13SFlorian Hahn; CHECK: pred.load.continue2: 1284173ed13SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = phi <4 x i32> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 1294173ed13SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2 1304173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP16]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 1314173ed13SFlorian Hahn; CHECK: pred.load.if3: 1324173ed13SFlorian Hahn; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[INDEX]], 2 1334173ed13SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP17]] 1344173ed13SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 4 1354173ed13SFlorian Hahn; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i32> [[TMP15]], i32 [[TMP19]], i32 2 1364173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 1374173ed13SFlorian Hahn; CHECK: pred.load.continue4: 1384173ed13SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = phi <4 x i32> [ [[TMP15]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP20]], [[PRED_LOAD_IF3]] ] 1394173ed13SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3 1404173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 1414173ed13SFlorian Hahn; CHECK: pred.load.if5: 1424173ed13SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = add i64 [[INDEX]], 3 1434173ed13SFlorian Hahn; CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP23]] 1444173ed13SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4 1454173ed13SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x i32> [[TMP21]], i32 [[TMP25]], i32 3 1464173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 1474173ed13SFlorian Hahn; CHECK: pred.load.continue6: 1484173ed13SFlorian Hahn; CHECK-NEXT: [[TMP27:%.*]] = phi <4 x i32> [ [[TMP21]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP26]], [[PRED_LOAD_IF5]] ] 1494173ed13SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = getelementptr [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[TMP0]] 1504173ed13SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[TMP28]], i32 0 1514173ed13SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD7:%.*]] = load <4 x i32>, ptr [[TMP29]], align 4 1524173ed13SFlorian Hahn; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i32> [[TMP27]], <4 x i32> [[WIDE_LOAD7]] 1534173ed13SFlorian Hahn; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 1544173ed13SFlorian Hahn; CHECK-NEXT: store <4 x i32> [[PREDPHI]], ptr [[TMP30]], align 4 1554173ed13SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 1564173ed13SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = icmp eq i64 [[INDEX_NEXT]], 32000 1574173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP31]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 1584173ed13SFlorian Hahn; CHECK: middle.block: 15996e83d37SFlorian Hahn; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]] 1604173ed13SFlorian Hahn; CHECK: scalar.ph: 1614173ed13SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 32000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 1624173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 1634173ed13SFlorian Hahn; CHECK: loop.header: 1644173ed13SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 1654173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]] 1664173ed13SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[GEP_DST]], align 4 1674173ed13SFlorian Hahn; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[D]], 0 1684173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 1694173ed13SFlorian Hahn; CHECK: if.then: 1704173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[IV]] 1714173ed13SFlorian Hahn; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4 1724173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 1734173ed13SFlorian Hahn; CHECK: if.else: 1744173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[IV]] 1754173ed13SFlorian Hahn; CHECK-NEXT: [[L_B:%.*]] = load i32, ptr [[GEP_B]], align 4 1764173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 1774173ed13SFlorian Hahn; CHECK: loop.latch: 1784173ed13SFlorian Hahn; CHECK-NEXT: [[TMP_0:%.*]] = phi i32 [ [[L_A]], [[IF_THEN]] ], [ [[L_B]], [[IF_ELSE]] ] 1794173ed13SFlorian Hahn; CHECK-NEXT: store i32 [[TMP_0]], ptr [[GEP_DST]], align 4 1804173ed13SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 1814173ed13SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 32001 1824173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]] 1834173ed13SFlorian Hahn; CHECK: exit: 1844173ed13SFlorian Hahn; CHECK-NEXT: ret void 1854173ed13SFlorian Hahn; 1864173ed13SFlorian Hahnentry: 1874173ed13SFlorian Hahn br label %loop.header 1884173ed13SFlorian Hahn 1894173ed13SFlorian Hahnloop.header: 1904173ed13SFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 1914173ed13SFlorian Hahn %gep.dst = getelementptr inbounds i32, ptr %dst, i64 %iv 1924173ed13SFlorian Hahn %d = load i32, ptr %gep.dst, align 4 1934173ed13SFlorian Hahn %cmp3 = icmp ult i32 %d, 0 1944173ed13SFlorian Hahn br i1 %cmp3, label %if.then, label %if.else 1954173ed13SFlorian Hahn 1964173ed13SFlorian Hahnif.then: 1974173ed13SFlorian Hahn %gep.a = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 0, i64 %iv 1984173ed13SFlorian Hahn %l.a = load i32, ptr %gep.a, align 4 1994173ed13SFlorian Hahn br label %loop.latch 2004173ed13SFlorian Hahn 2014173ed13SFlorian Hahnif.else: 2024173ed13SFlorian Hahn %gep.b = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 1, i64 %iv 2034173ed13SFlorian Hahn %l.b = load i32, ptr %gep.b, align 4 2044173ed13SFlorian Hahn br label %loop.latch 2054173ed13SFlorian Hahn 2064173ed13SFlorian Hahnloop.latch: 2074173ed13SFlorian Hahn %tmp.0 = phi i32 [ %l.a, %if.then ], [ %l.b, %if.else ] 2084173ed13SFlorian Hahn store i32 %tmp.0, ptr %gep.dst, align 4 2094173ed13SFlorian Hahn %iv.next = add nuw nsw i64 %iv, 1 2104173ed13SFlorian Hahn %exitcond.not = icmp eq i64 %iv.next, 32001 2114173ed13SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.header 2124173ed13SFlorian Hahn 2134173ed13SFlorian Hahnexit: 2144173ed13SFlorian Hahn ret void 2154173ed13SFlorian Hahn} 2164173ed13SFlorian Hahn 2174173ed13SFlorian Hahndefine void @accesses_to_struct_may_not_be_dereferenceable_access_size(ptr noalias %dst) { 2184173ed13SFlorian Hahn; CHECK-LABEL: define void @accesses_to_struct_may_not_be_dereferenceable_access_size 2194173ed13SFlorian Hahn; CHECK-SAME: (ptr noalias [[DST:%.*]]) { 2204173ed13SFlorian Hahn; CHECK-NEXT: entry: 2214173ed13SFlorian Hahn; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 2224173ed13SFlorian Hahn; CHECK: vector.ph: 2234173ed13SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 2244173ed13SFlorian Hahn; CHECK: vector.body: 2254173ed13SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_LOAD_CONTINUE6:%.*]] ] 2264173ed13SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 2274173ed13SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[TMP0]] 2284173ed13SFlorian Hahn; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 2294173ed13SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 2304173ed13SFlorian Hahn; CHECK-NEXT: [[TMP3:%.*]] = icmp ult <4 x i32> [[WIDE_LOAD]], zeroinitializer 231*38fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true) 2324173ed13SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0 2334173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP5]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]] 2344173ed13SFlorian Hahn; CHECK: pred.load.if: 2354173ed13SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_FOO:%.*]], ptr @foo, i64 0, i32 1, i64 [[TMP0]] 2364173ed13SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP6]], align 4 2374173ed13SFlorian Hahn; CHECK-NEXT: [[TMP8:%.*]] = insertelement <4 x i64> poison, i64 [[TMP7]], i32 0 2384173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]] 2394173ed13SFlorian Hahn; CHECK: pred.load.continue: 2404173ed13SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = phi <4 x i64> [ poison, [[VECTOR_BODY]] ], [ [[TMP8]], [[PRED_LOAD_IF]] ] 2414173ed13SFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1 2424173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]] 2434173ed13SFlorian Hahn; CHECK: pred.load.if1: 2444173ed13SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], 1 2454173ed13SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP11]] 2464173ed13SFlorian Hahn; CHECK-NEXT: [[TMP13:%.*]] = load i64, ptr [[TMP12]], align 4 2474173ed13SFlorian Hahn; CHECK-NEXT: [[TMP14:%.*]] = insertelement <4 x i64> [[TMP9]], i64 [[TMP13]], i32 1 2484173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]] 2494173ed13SFlorian Hahn; CHECK: pred.load.continue2: 2504173ed13SFlorian Hahn; CHECK-NEXT: [[TMP15:%.*]] = phi <4 x i64> [ [[TMP9]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ] 2514173ed13SFlorian Hahn; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2 2524173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP16]], label [[PRED_LOAD_IF3:%.*]], label [[PRED_LOAD_CONTINUE4:%.*]] 2534173ed13SFlorian Hahn; CHECK: pred.load.if3: 2544173ed13SFlorian Hahn; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[INDEX]], 2 2554173ed13SFlorian Hahn; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP17]] 2564173ed13SFlorian Hahn; CHECK-NEXT: [[TMP19:%.*]] = load i64, ptr [[TMP18]], align 4 2574173ed13SFlorian Hahn; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i64> [[TMP15]], i64 [[TMP19]], i32 2 2584173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE4]] 2594173ed13SFlorian Hahn; CHECK: pred.load.continue4: 2604173ed13SFlorian Hahn; CHECK-NEXT: [[TMP21:%.*]] = phi <4 x i64> [ [[TMP15]], [[PRED_LOAD_CONTINUE2]] ], [ [[TMP20]], [[PRED_LOAD_IF3]] ] 2614173ed13SFlorian Hahn; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3 2624173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP22]], label [[PRED_LOAD_IF5:%.*]], label [[PRED_LOAD_CONTINUE6]] 2634173ed13SFlorian Hahn; CHECK: pred.load.if5: 2644173ed13SFlorian Hahn; CHECK-NEXT: [[TMP23:%.*]] = add i64 [[INDEX]], 3 2654173ed13SFlorian Hahn; CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[TMP23]] 2664173ed13SFlorian Hahn; CHECK-NEXT: [[TMP25:%.*]] = load i64, ptr [[TMP24]], align 4 2674173ed13SFlorian Hahn; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x i64> [[TMP21]], i64 [[TMP25]], i32 3 2684173ed13SFlorian Hahn; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE6]] 2694173ed13SFlorian Hahn; CHECK: pred.load.continue6: 2704173ed13SFlorian Hahn; CHECK-NEXT: [[TMP27:%.*]] = phi <4 x i64> [ [[TMP21]], [[PRED_LOAD_CONTINUE4]] ], [ [[TMP26]], [[PRED_LOAD_IF5]] ] 2714173ed13SFlorian Hahn; CHECK-NEXT: [[TMP28:%.*]] = trunc <4 x i64> [[TMP27]] to <4 x i32> 2724173ed13SFlorian Hahn; CHECK-NEXT: [[TMP29:%.*]] = getelementptr [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[TMP0]] 2734173ed13SFlorian Hahn; CHECK-NEXT: [[TMP30:%.*]] = getelementptr i32, ptr [[TMP29]], i32 0 2744173ed13SFlorian Hahn; CHECK-NEXT: [[WIDE_LOAD7:%.*]] = load <4 x i32>, ptr [[TMP30]], align 4 2754173ed13SFlorian Hahn; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i32> [[TMP28]], <4 x i32> [[WIDE_LOAD7]] 2764173ed13SFlorian Hahn; CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 2774173ed13SFlorian Hahn; CHECK-NEXT: store <4 x i32> [[PREDPHI]], ptr [[TMP31]], align 4 2784173ed13SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 2794173ed13SFlorian Hahn; CHECK-NEXT: [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], 32000 2804173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[TMP32]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 2814173ed13SFlorian Hahn; CHECK: middle.block: 28296e83d37SFlorian Hahn; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]] 2834173ed13SFlorian Hahn; CHECK: scalar.ph: 2844173ed13SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 32000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 2854173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 2864173ed13SFlorian Hahn; CHECK: loop.header: 2874173ed13SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 2884173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV]] 2894173ed13SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[GEP_DST]], align 4 2904173ed13SFlorian Hahn; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[D]], 0 2914173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 2924173ed13SFlorian Hahn; CHECK: if.then: 2934173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 0, i64 [[IV]] 2944173ed13SFlorian Hahn; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4 2954173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 2964173ed13SFlorian Hahn; CHECK: if.else: 2974173ed13SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], ptr @foo, i64 0, i32 1, i64 [[IV]] 2984173ed13SFlorian Hahn; CHECK-NEXT: [[L_B:%.*]] = load i64, ptr [[GEP_B]], align 4 2994173ed13SFlorian Hahn; CHECK-NEXT: [[T:%.*]] = trunc i64 [[L_B]] to i32 3004173ed13SFlorian Hahn; CHECK-NEXT: br label [[LOOP_LATCH]] 3014173ed13SFlorian Hahn; CHECK: loop.latch: 3024173ed13SFlorian Hahn; CHECK-NEXT: [[TMP_0:%.*]] = phi i32 [ [[L_A]], [[IF_THEN]] ], [ [[T]], [[IF_ELSE]] ] 3034173ed13SFlorian Hahn; CHECK-NEXT: store i32 [[TMP_0]], ptr [[GEP_DST]], align 4 3044173ed13SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 3054173ed13SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 32000 3064173ed13SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[LOOP_HEADER]], !llvm.loop [[LOOP7:![0-9]+]] 3074173ed13SFlorian Hahn; CHECK: exit: 3084173ed13SFlorian Hahn; CHECK-NEXT: ret void 3094173ed13SFlorian Hahn; 3104173ed13SFlorian Hahnentry: 3114173ed13SFlorian Hahn br label %loop.header 3124173ed13SFlorian Hahn 3134173ed13SFlorian Hahnloop.header: 3144173ed13SFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] 3154173ed13SFlorian Hahn %gep.dst = getelementptr inbounds i32, ptr %dst, i64 %iv 3164173ed13SFlorian Hahn %d = load i32, ptr %gep.dst, align 4 3174173ed13SFlorian Hahn %cmp3 = icmp ult i32 %d, 0 3184173ed13SFlorian Hahn br i1 %cmp3, label %if.then, label %if.else 3194173ed13SFlorian Hahn 3204173ed13SFlorian Hahnif.then: 3214173ed13SFlorian Hahn %gep.a = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 0, i64 %iv 3224173ed13SFlorian Hahn %l.a = load i32, ptr %gep.a, align 4 3234173ed13SFlorian Hahn br label %loop.latch 3244173ed13SFlorian Hahn 3254173ed13SFlorian Hahnif.else: 3264173ed13SFlorian Hahn %gep.b = getelementptr inbounds %struct.Foo, ptr @foo, i64 0, i32 1, i64 %iv 3274173ed13SFlorian Hahn %l.b = load i64, ptr %gep.b, align 4 3284173ed13SFlorian Hahn %t = trunc i64 %l.b to i32 3294173ed13SFlorian Hahn br label %loop.latch 3304173ed13SFlorian Hahn 3314173ed13SFlorian Hahnloop.latch: 3324173ed13SFlorian Hahn %tmp.0 = phi i32 [ %l.a, %if.then ], [ %t, %if.else ] 3334173ed13SFlorian Hahn store i32 %tmp.0, ptr %gep.dst, align 4 3344173ed13SFlorian Hahn %iv.next = add nuw nsw i64 %iv, 1 3354173ed13SFlorian Hahn %exitcond.not = icmp eq i64 %iv.next, 32000 3364173ed13SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.header 3374173ed13SFlorian Hahn 3384173ed13SFlorian Hahnexit: 3394173ed13SFlorian Hahn ret void 3404173ed13SFlorian Hahn} 341