; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -mtriple=thumbv7 -passes=typepromotion -S %s -o - | FileCheck %s
define hidden void @dont_promote_large_int(ptr %in, ptr %out) {
; CHECK-LABEL: @dont_promote_large_int(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[LOAD:%.*]] = load i144, ptr [[IN:%.*]], align 4
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i144 [[LOAD]] to i98
; CHECK-NEXT: [[AND:%.*]] = and i98 [[TRUNC]], -79228162514264337593543950336
; CHECK-NEXT: [[TRUNC_1:%.*]] = trunc i98 [[TRUNC]] to i32
; CHECK-NEXT: switch i98 [[AND]], label [[BB_3:%.*]] [
; CHECK-NEXT: i98 79228162514264337593543950336, label [[BB_1:%.*]]
; CHECK-NEXT: i98 0, label [[BB_2:%.*]]
; CHECK-NEXT: ]
; CHECK: bb.1:
; CHECK-NEXT: [[AND_1:%.*]] = and i144 [[LOAD]], 237684487542793012780631851008
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i144 [[AND_1]], 0
; CHECK-NEXT: [[INDEX:%.*]] = select i1 [[CMP]], i32 0, i32 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[OUT:%.*]], i32 [[INDEX]]
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[TRUNC_1]], 27
; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 0, [[MUL]]
; CHECK-NEXT: [[CAST_1:%.*]] = zext i32 [[SUB]] to i64
; CHECK-NEXT: store i64 [[CAST_1]], ptr [[OUT]], align 4
; CHECK-NEXT: br label [[BB_3]]
; CHECK: bb.2:
; CHECK-NEXT: [[CAST_2:%.*]] = zext i32 [[TRUNC_1]] to i64
; CHECK-NEXT: [[SHL:%.*]] = shl nuw i64 [[CAST_2]], 32
; CHECK-NEXT: [[OR:%.*]] = or i64 [[CAST_2]], [[SHL]]
; CHECK-NEXT: store i64 [[OR]], ptr [[OUT]], align 4
; CHECK-NEXT: br label [[BB_3]]
; CHECK: bb.3:
; CHECK-NEXT: ret void
;
entry:
%load = load i144, ptr %in, align 4
%trunc = trunc i144 %load to i98
%and = and i98 %trunc, -79228162514264337593543950336
%trunc.1 = trunc i98 %trunc to i32
switch i98 %and, label %bb.3 [
i98 79228162514264337593543950336, label %bb.1
i98 0, label %bb.2
]
bb.1:
%and.1 = and i144 %load, 237684487542793012780631851008
%cmp = icmp eq i144 %and.1, 0
%index = select i1 %cmp, i32 0, i32 4
%gep = getelementptr i64, ptr %out, i32 %index
%mul = mul nuw i32 %trunc.1, 27
%sub = sub nuw i32 0, %mul
%cast.1 = zext i32 %sub to i64
store i64 %cast.1, ptr %out, align 4
br label %bb.3
bb.2:
%cast.2 = zext i32 %trunc.1 to i64
%shl = shl nuw i64 %cast.2, 32
%or = or i64 %cast.2, %shl
store i64 %or, ptr %out, align 4
br label %bb.3
bb.3:
ret void
}