1352a8361SDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2352a8361SDavid Green; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3352a8361SDavid Green 4352a8361SDavid Greendefine ptr @mul4(ptr %p, i64 %x) { 5352a8361SDavid Green; CHECK-LABEL: define ptr @mul4( 6352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 7352a8361SDavid Green; CHECK-NEXT: entry: 8352a8361SDavid Green; CHECK-NEXT: [[GEP_IDX:%.*]] = shl i64 [[X]], 4 9352a8361SDavid Green; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[GEP_IDX]] 10352a8361SDavid Green; CHECK-NEXT: ret ptr [[GEP]] 11352a8361SDavid Green; 12352a8361SDavid Greenentry: 13352a8361SDavid Green %mul = mul i64 %x, 4 14352a8361SDavid Green %gep = getelementptr inbounds i32, ptr %p, i64 %mul 15352a8361SDavid Green ret ptr %gep 16352a8361SDavid Green} 17352a8361SDavid Green 18*99d8bc9eSNikita Popovdefine ptr @mul4_nuw(ptr %p, i64 %x) { 19*99d8bc9eSNikita Popov; CHECK-LABEL: define ptr @mul4_nuw( 20*99d8bc9eSNikita Popov; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 21*99d8bc9eSNikita Popov; CHECK-NEXT: entry: 22*99d8bc9eSNikita Popov; CHECK-NEXT: [[GEP_IDX:%.*]] = shl i64 [[X]], 4 23*99d8bc9eSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[GEP_IDX]] 24*99d8bc9eSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 25*99d8bc9eSNikita Popov; 26*99d8bc9eSNikita Popoventry: 27*99d8bc9eSNikita Popov %mul = mul i64 %x, 4 28*99d8bc9eSNikita Popov %gep = getelementptr nuw i32, ptr %p, i64 %mul 29*99d8bc9eSNikita Popov ret ptr %gep 30*99d8bc9eSNikita Popov} 31*99d8bc9eSNikita Popov 32352a8361SDavid Greendefine ptr @mul5(ptr %p, i64 %x) { 33352a8361SDavid Green; CHECK-LABEL: define ptr @mul5( 34352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 35352a8361SDavid Green; CHECK-NEXT: entry: 36352a8361SDavid Green; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 20 37352a8361SDavid Green; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[GEP_IDX]] 38352a8361SDavid Green; CHECK-NEXT: ret ptr [[GEP]] 39352a8361SDavid Green; 40352a8361SDavid Greenentry: 41352a8361SDavid Green %mul = mul i64 %x, 5 42352a8361SDavid Green %gep = getelementptr inbounds i32, ptr %p, i64 %mul 43352a8361SDavid Green ret ptr %gep 44352a8361SDavid Green} 45352a8361SDavid Green 46352a8361SDavid Greendefine ptr @noinbounds(ptr %p, i64 %x) { 47352a8361SDavid Green; CHECK-LABEL: define ptr @noinbounds( 48352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 49352a8361SDavid Green; CHECK-NEXT: entry: 50352a8361SDavid Green; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 20 51352a8361SDavid Green; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 [[GEP_IDX]] 52352a8361SDavid Green; CHECK-NEXT: ret ptr [[GEP]] 53352a8361SDavid Green; 54352a8361SDavid Greenentry: 55352a8361SDavid Green %mul = mul i64 %x, 5 56352a8361SDavid Green %gep = getelementptr i32, ptr %p, i64 %mul 57352a8361SDavid Green ret ptr %gep 58352a8361SDavid Green} 59352a8361SDavid Green 60352a8361SDavid Greendefine ptr @usemul(ptr %p, i64 %x) { 61352a8361SDavid Green; CHECK-LABEL: define ptr @usemul( 62352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 63352a8361SDavid Green; CHECK-NEXT: entry: 64352a8361SDavid Green; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[X]], 5 65352a8361SDavid Green; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 [[MUL]] 66352a8361SDavid Green; CHECK-NEXT: call void @use(i64 [[MUL]]) 67352a8361SDavid Green; CHECK-NEXT: ret ptr [[GEP]] 68352a8361SDavid Green; 69352a8361SDavid Greenentry: 70352a8361SDavid Green %mul = mul i64 %x, 5 71352a8361SDavid Green %gep = getelementptr inbounds i32, ptr %p, i64 %mul 72352a8361SDavid Green call void @use(i64 %mul) 73352a8361SDavid Green ret ptr %gep 74352a8361SDavid Green} 75352a8361SDavid Green 76352a8361SDavid Greendefine void @multiple(ptr %p, i64 %x) { 77352a8361SDavid Green; CHECK-LABEL: define void @multiple( 78352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 79352a8361SDavid Green; CHECK-NEXT: entry: 80352a8361SDavid Green; CHECK-NEXT: [[MUL21:%.*]] = mul i64 [[X]], 20 81352a8361SDavid Green; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL21]] 82352a8361SDavid Green; CHECK-NEXT: [[MUL20:%.*]] = mul i64 [[X]], 20 83352a8361SDavid Green; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL20]] 84352a8361SDavid Green; CHECK-NEXT: call void @use2(ptr [[GEP3]], ptr [[GEP2]]) 85352a8361SDavid Green; CHECK-NEXT: ret void 86352a8361SDavid Green; 87352a8361SDavid Greenentry: 88352a8361SDavid Green %mul5 = mul i64 %x, 5 89352a8361SDavid Green %gep1 = getelementptr inbounds i32, ptr %p, i64 %mul5 90352a8361SDavid Green %mul20 = mul i64 %x, 20 91352a8361SDavid Green %gep2 = getelementptr inbounds i8, ptr %p, i64 %mul20 92352a8361SDavid Green call void @use2(ptr %gep1, ptr %gep2) 93352a8361SDavid Green ret void 94352a8361SDavid Green} 95352a8361SDavid Green 96352a8361SDavid Greendefine void @multiplestore(ptr %p, i64 %x) { 97352a8361SDavid Green; CHECK-LABEL: define void @multiplestore( 98352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { 99352a8361SDavid Green; CHECK-NEXT: entry: 100352a8361SDavid Green; CHECK-NEXT: [[MUL20:%.*]] = mul i64 [[X]], 20 101352a8361SDavid Green; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL20]] 102352a8361SDavid Green; CHECK-NEXT: [[MUL21:%.*]] = mul i64 [[X]], 20 103352a8361SDavid Green; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL21]] 104352a8361SDavid Green; CHECK-NEXT: store i32 0, ptr [[GEP2]], align 4 105352a8361SDavid Green; CHECK-NEXT: store i32 1, ptr [[GEP3]], align 4 106352a8361SDavid Green; CHECK-NEXT: ret void 107352a8361SDavid Green; 108352a8361SDavid Greenentry: 109352a8361SDavid Green %mul5 = mul i64 %x, 5 110352a8361SDavid Green %gep1 = getelementptr inbounds i32, ptr %p, i64 %mul5 111352a8361SDavid Green %mul20 = mul i64 %x, 20 112352a8361SDavid Green %gep2 = getelementptr inbounds i8, ptr %p, i64 %mul20 113352a8361SDavid Green store i32 0, ptr %gep1 114352a8361SDavid Green store i32 1, ptr %gep2 115352a8361SDavid Green ret void 116352a8361SDavid Green} 117352a8361SDavid Green 118352a8361SDavid Greendeclare void @use(i64) 119352a8361SDavid Greendeclare void @use2(ptr, ptr) 120