blob: dd71e8ff41838bcf0870ca838b55827c40eecaae [file] [log] [blame]
;RUN: dsaopt %s -dsa-local -analyze -check-type=main:ia:0,0:i16\|i32::4:i8
; ModuleID = 'bitfields1.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
%struct.anon = type <{ i16, i16, i8, [3 x i8] }>
%union.I_format_t = type { i32, [1 x i32] }
@.str = private constant [18 x i8] c"\0Ainstruction: %X\0A\00", align 1 ; <[18 x i8]*> [#uses=1]
@.str1 = private constant [12 x i8] c"opcode: %X\0A\00", align 1 ; <[12 x i8]*> [#uses=1]
@.str2 = private constant [23 x i8] c"rs: %d rt: %d rj: %d \0A\00", align 1 ; <[23 x i8]*> [#uses=1]
@.str3 = private constant [11 x i8] c"immed: %d\0A\00", align 1 ; <[11 x i8]*> [#uses=1]
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=2]
%0 = alloca i32 ; <i32*> [#uses=2]
%ia = alloca %union.I_format_t* ; <%union.I_format_t**> [#uses=8]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
%1 = call noalias i8* @malloc(i64 8) nounwind ; <i8*> [#uses=1]
%2 = bitcast i8* %1 to %union.I_format_t* ; <%union.I_format_t*> [#uses=1]
store %union.I_format_t* %2, %union.I_format_t** %ia, align 8
%3 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%4 = getelementptr inbounds %union.I_format_t* %3, i32 0, i32 0 ; <i32*> [#uses=1]
store i32 -1346502640, i32* %4, align 4
%5 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%6 = getelementptr inbounds %union.I_format_t* %5, i32 0, i32 0 ; <i32*> [#uses=1]
%7 = load i32* %6, align 4 ; <i32> [#uses=1]
%8 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([18 x i8]* @.str, i64 0, i64 0), i32 %7) nounwind ; <i32> [#uses=0]
%9 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%10 = getelementptr inbounds %union.I_format_t* %9, i32 0, i32 0 ; <i32*> [#uses=1]
%11 = bitcast i32* %10 to %struct.anon* ; <%struct.anon*> [#uses=1]
%12 = getelementptr inbounds %struct.anon* %11, i32 0, i32 2 ; <i8*> [#uses=1]
%13 = load i8* %12, align 1 ; <i8> [#uses=1]
%14 = shl i8 %13, 2 ; <i8> [#uses=1]
%15 = lshr i8 %14, 2 ; <i8> [#uses=1]
%16 = trunc i8 %15 to i6 ; <i6> [#uses=1]
%17 = zext i6 %16 to i32 ; <i32> [#uses=1]
%18 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([12 x i8]* @.str1, i64 0, i64 0), i32 %17) nounwind ; <i32> [#uses=0]
%19 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%20 = getelementptr inbounds %union.I_format_t* %19, i32 0, i32 0 ; <i32*> [#uses=1]
%21 = bitcast i32* %20 to %struct.anon* ; <%struct.anon*> [#uses=1]
%22 = getelementptr inbounds %struct.anon* %21, i32 0, i32 0 ; <i16*> [#uses=1]
%23 = bitcast i16* %22 to i32* ; <i32*> [#uses=1]
%24 = load i32* %23, align 1 ; <i32> [#uses=1]
%25 = shl i32 %24, 1 ; <i32> [#uses=1]
%26 = lshr i32 %25, 27 ; <i32> [#uses=1]
%27 = trunc i32 %26 to i5 ; <i5> [#uses=1]
%28 = zext i5 %27 to i32 ; <i32> [#uses=1]
%29 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%30 = getelementptr inbounds %union.I_format_t* %29, i32 0, i32 0 ; <i32*> [#uses=1]
%31 = bitcast i32* %30 to %struct.anon* ; <%struct.anon*> [#uses=1]
%32 = getelementptr inbounds %struct.anon* %31, i32 0, i32 0 ; <i16*> [#uses=1]
%33 = bitcast i16* %32 to i32* ; <i32*> [#uses=1]
%34 = load i32* %33, align 1 ; <i32> [#uses=1]
%35 = shl i32 %34, 11 ; <i32> [#uses=1]
%36 = lshr i32 %35, 27 ; <i32> [#uses=1]
%37 = trunc i32 %36 to i5 ; <i5> [#uses=1]
%38 = zext i5 %37 to i32 ; <i32> [#uses=1]
%39 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%40 = getelementptr inbounds %union.I_format_t* %39, i32 0, i32 0 ; <i32*> [#uses=1]
%41 = bitcast i32* %40 to %struct.anon* ; <%struct.anon*> [#uses=1]
%42 = getelementptr inbounds %struct.anon* %41, i32 0, i32 0 ; <i16*> [#uses=1]
%43 = bitcast i16* %42 to i32* ; <i32*> [#uses=1]
%44 = load i32* %43, align 1 ; <i32> [#uses=1]
%45 = shl i32 %44, 6 ; <i32> [#uses=1]
%46 = lshr i32 %45, 27 ; <i32> [#uses=1]
%47 = trunc i32 %46 to i5 ; <i5> [#uses=1]
%48 = zext i5 %47 to i32 ; <i32> [#uses=1]
%49 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([23 x i8]* @.str2, i64 0, i64 0), i32 %48, i32 %38, i32 %28) nounwind ; <i32> [#uses=0]
%50 = load %union.I_format_t** %ia, align 8 ; <%union.I_format_t*> [#uses=1]
%51 = getelementptr inbounds %union.I_format_t* %50, i32 0, i32 0 ; <i32*> [#uses=1]
%52 = bitcast i32* %51 to %struct.anon* ; <%struct.anon*> [#uses=1]
%53 = getelementptr inbounds %struct.anon* %52, i32 0, i32 0 ; <i16*> [#uses=1]
%54 = load i16* %53, align 1 ; <i16> [#uses=1]
%55 = sext i16 %54 to i32 ; <i32> [#uses=1]
%56 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([11 x i8]* @.str3, i64 0, i64 0), i32 %55) nounwind ; <i32> [#uses=0]
store i32 0, i32* %0, align 4
%57 = load i32* %0, align 4 ; <i32> [#uses=1]
store i32 %57, i32* %retval, align 4
br label %return
return: ; preds = %entry
%retval1 = load i32* %retval ; <i32> [#uses=1]
ret i32 %retval1
}
declare noalias i8* @malloc(i64) nounwind
declare i32 @printf(i8* noalias, ...) nounwind