81 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4@glob = internal global [10 x [10 x [10 x i32]]] zeroinitializer5 6define ptr @x12(i64 %x) {7; CHECK-LABEL: define ptr @x12(8; CHECK-SAME: i64 [[X:%.*]]) {9; CHECK-NEXT: entry:10; CHECK-NEXT: [[GEP_IDX:%.*]] = mul nsw i64 [[X]], 40011; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 84), i64 [[GEP_IDX]]12; CHECK-NEXT: ret ptr [[GEP]]13;14entry:15 %gep = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr (i8, ptr @glob, i64 36), i64 0, i64 %x, i64 1, i64 216 ret ptr %gep17}18 19define ptr @x1y(i64 %x, i64 %y) {20; CHECK-LABEL: define ptr @x1y(21; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]]) {22; CHECK-NEXT: entry:23; CHECK-NEXT: [[GEP_IDX:%.*]] = mul nsw i64 [[X]], 40024; CHECK-NEXT: [[GEP_IDX1:%.*]] = shl nsw i64 [[Y]], 225; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 116), i64 [[GEP_IDX]]26; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[GEP_IDX1]]27; CHECK-NEXT: ret ptr [[GEP]]28;29entry:30 %gep = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr (i8, ptr @glob, i64 36), i64 0, i64 %x, i64 2, i64 %y31 ret ptr %gep32}33 34define ptr @xzy(i64 %x, i64 %y, i64 %z) {35; CHECK-LABEL: define ptr @xzy(36; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]) {37; CHECK-NEXT: entry:38; CHECK-NEXT: [[GEP_SPLIT:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr getelementptr inbounds nuw (i8, ptr @glob, i64 40), i64 [[X]]39; CHECK-NEXT: [[GEP_SPLIT1:%.*]] = getelementptr inbounds [10 x i32], ptr [[GEP_SPLIT]], i64 [[Z]]40; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[GEP_SPLIT1]], i64 [[Y]]41; CHECK-NEXT: ret ptr [[GEP]]42;43entry:44 %gep = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr (i8, ptr @glob, i64 40), i64 0, i64 %x, i64 %z, i64 %y45 ret ptr %gep46}47 48define ptr @zerox(i64 %x) {49; CHECK-LABEL: define ptr @zerox(50; CHECK-SAME: i64 [[X:%.*]]) {51; CHECK-NEXT: entry:52; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 32), i64 [[X]]53; CHECK-NEXT: ret ptr [[GEP]]54;55entry:56 %gep = getelementptr inbounds [10 x i32], ptr getelementptr (i8, ptr @glob, i64 32), i64 0, i64 %x57 ret ptr %gep58}59 60define i32 @twoloads(i64 %x) {61; CHECK-LABEL: define i32 @twoloads(62; CHECK-SAME: i64 [[X:%.*]]) {63; CHECK-NEXT: entry:64; CHECK-NEXT: [[GEP1_IDX:%.*]] = mul nsw i64 [[X]], 40065; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 134), i64 [[GEP1_IDX]]66; CHECK-NEXT: [[GEP2_IDX:%.*]] = mul nsw i64 [[X]], 40067; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 132), i64 [[GEP2_IDX]]68; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[GEP1]], align 469; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[GEP2]], align 470; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[B]]71; CHECK-NEXT: ret i32 [[C]]72;73entry:74 %gep1 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr (i8, ptr @glob, i64 50), i64 0, i64 %x, i64 2, i64 175 %gep2 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr (i8, ptr @glob, i64 36), i64 0, i64 %x, i64 2, i64 476 %a = load i32, ptr %gep177 %b = load i32, ptr %gep278 %c = add i32 %a, %b79 ret i32 %c80}81