; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -S -passes="require,function(codegenprepare)" %s -o - | FileCheck %s target triple = "x86_64-unknown-linux-gnu" define ptr @testNegativeResultIndexNUW(ptr %memory, ptr %blockaddress) { ; CHECK-LABEL: define ptr @testNegativeResultIndexNUW( ; CHECK-SAME: ptr [[MEMORY:%.*]], ptr [[BLOCKADDRESS:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[POINTER:%.*]] = load ptr, ptr [[MEMORY]], align 8 ; CHECK-NEXT: [[INITALGEP:%.*]] = getelementptr i8, ptr [[POINTER]], i64 8 ; CHECK-NEXT: indirectbr ptr [[BLOCKADDRESS]], [label %[[EXIT:.*]]] ; CHECK: [[EXIT]]: ; CHECK-NEXT: [[UNMERGEDGEP:%.*]] = getelementptr i8, ptr [[INITALGEP]], i64 -1 ; CHECK-NEXT: [[USEOFFIRSTGEP:%.*]] = load i8, ptr [[INITALGEP]], align 1 ; CHECK-NEXT: ret ptr [[UNMERGEDGEP]] ; entry: %pointer = load ptr, ptr %memory, align 8 %initalGEP = getelementptr i8, ptr %pointer, i64 8 indirectbr ptr %blockaddress, [label %exit] exit: %unmergedGEP = getelementptr nuw i8, ptr %pointer, i64 7 %useOfFirstGEP = load i8, ptr %initalGEP, align 1 ret ptr %unmergedGEP } define ptr @testResultFlagIntersection(ptr %memory, ptr %blockaddress) { ; CHECK-LABEL: define ptr @testResultFlagIntersection( ; CHECK-SAME: ptr [[MEMORY:%.*]], ptr [[BLOCKADDRESS:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[POINTER:%.*]] = load ptr, ptr [[MEMORY]], align 8 ; CHECK-NEXT: [[INITALGEP:%.*]] = getelementptr i8, ptr [[POINTER]], i64 -1 ; CHECK-NEXT: indirectbr ptr [[BLOCKADDRESS]], [label %[[EXIT:.*]]] ; CHECK: [[EXIT]]: ; CHECK-NEXT: [[UNMERGEDGEP1:%.*]] = getelementptr i8, ptr [[INITALGEP]], i64 2 ; CHECK-NEXT: [[UNMERGEDGEP2:%.*]] = getelementptr i8, ptr [[INITALGEP]], i64 3 ; CHECK-NEXT: [[USEOFFIRSTGEP:%.*]] = load i8, ptr [[INITALGEP]], align 1 ; CHECK-NEXT: ret ptr [[UNMERGEDGEP1]] ; entry: %pointer = load ptr, ptr %memory, align 8 %initalGEP = getelementptr i8, ptr %pointer, i64 -1 indirectbr ptr %blockaddress, [label %exit] exit: %unmergedGEP1 = getelementptr nuw i8, ptr %pointer, i64 1 %unmergedGEP2 = getelementptr inbounds i8, ptr %pointer, i64 2 %useOfFirstGEP = load i8, ptr %initalGEP, align 1 ret ptr %unmergedGEP1 }