; RUN: opt -consthoist -consthoist-gep -S -o - %s | FileCheck %s target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" target triple = "thumbv6m-none--musleabi" ; Check that for the same offset from the base constant, different types are materialized separately. ; CHECK: %const = bitcast %5** getelementptr inbounds (%0, %0* @global, i32 0, i32 2, i32 0) to %5** ; CHECK: %tmp = load %5*, %5** %const, align 4 ; CHECK: %base_bitcast = bitcast %5** %const to i8* ; CHECK: %mat_gep = getelementptr i8, i8* %base_bitcast, i32 0 ; CHECK: %mat_bitcast = bitcast i8* %mat_gep to %4* ; CHECK: tail call void undef(%5* nonnull %tmp, %4* %mat_bitcast) %0 = type { [16 x %1], %2, %4, [16 x %5], %6, %7, i32, [4 x i32], [8 x %3], i8, i8, i8, i8, i8, i8, i8, %8, %11, %11*, i32, i16, i8, i8, i8, i8, i8, i8, [15 x i16], i8, i8, [23 x %12], i8, i8*, i8, %13, i8, i8 } %1 = type { i32, i32, i8, i8, i8, i8, i8, i8, i8, i8 } %2 = type { %3*, i16, i16, i16 } %3 = type { [4 x i32] } %4 = type { %5*, %5*, i8 } %5 = type { [4 x i32], i8*, i8, i8 } %6 = type { i8, [4 x i32] } %7 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } %8 = type { [16 x %9], %9*, %9*, %9*, %9*, %11, %11, %11, i8, i8, i8, i8 } %9 = type { %1, %11, %11, %9*, %9*, %10, i8, i8, i8, i8 } %10 = type { i32, i16 } %11 = type { %11*, %11* } %12 = type { i8, i16, i32 } %13 = type { i32, i32, i8 } @global = external dso_local global %0, align 4 ; Function Attrs: nounwind optsize ssp define dso_local void @zot() { bb: br i1 undef, label %bb2, label %bb1 bb1: ; preds = %bb %tmp = load %5*, %5** getelementptr inbounds (%0, %0* @global, i32 0, i32 2, i32 0), align 4 tail call void undef(%5* nonnull %tmp, %4* getelementptr inbounds (%0, %0* @global, i32 0, i32 2)) unreachable bb2: ; preds = %bb ret void }