Compiler projects using llvm
; 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
}