; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -S -passes='separate-const-offset-from-gep' < %s | FileCheck %s target datalayout = "p:32:32" define ptr @test(ptr %p, i32 %a) { ; CHECK-LABEL: define ptr @test( ; CHECK-SAME: ptr [[P:%.*]], i32 [[A:%.*]]) { ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[A]], 2 ; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] ; CHECK-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[UGLYGEP]], i32 -4 ; CHECK-NEXT: ret ptr [[UGLYGEP2]] ; %add = add i32 %a, -1 %gep = getelementptr i32, ptr %p, i32 %add ret ptr %gep } define ptr @test_overflow(ptr %p, i32 %a) { ; CHECK-LABEL: define ptr @test_overflow( ; CHECK-SAME: ptr [[P:%.*]], i32 [[A:%.*]]) { ; CHECK-NEXT: [[ADD22:%.*]] = add i32 [[A]], -2147483648 ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[ADD22]], 2 ; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] ; CHECK-NEXT: ret ptr [[UGLYGEP]] ; %add1 = add i32 %a, u0x80000000 %add2 = add i32 %add1, u0x80000000 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add2 ret ptr %arrayidx } define ptr @test_xor_overflow(ptr %p, i32 range(i32 0, -2147483648) %a) { ; CHECK-LABEL: define ptr @test_xor_overflow( ; CHECK-SAME: ptr [[P:%.*]], i32 range(i32 0, -2147483648) [[A:%.*]]) { ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[A]], -1 ; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 [[XOR]] ; CHECK-NEXT: ret ptr [[UGLYGEP]] ; %xor = xor i32 %a, -1 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %xor ret ptr %arrayidx }