Should cover most of the tests for GVN, GVNHoist, GVNSink, GlobalOpt, GlobalSplit, InstCombine, Reassociate, SROA and TailCallElim that had not been updated earlier.
34 lines
1.1 KiB
LLVM
34 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -passes=reassociate,dce < %s | FileCheck %s
|
|
|
|
; The two va_arg instructions depend on the memory/context, are therfore not
|
|
; identical and the sub should not be optimized to 0 by reassociate.
|
|
;
|
|
; ...
|
|
; ...
|
|
define i32 @func(i32 %dummy, ...) {
|
|
;
|
|
; CHECK-LABEL: @func(
|
|
; CHECK-NEXT: [[VARARGS:%.*]] = alloca ptr, align 8
|
|
; CHECK-NEXT: call void @llvm.va_start(ptr [[VARARGS]])
|
|
; CHECK-NEXT: [[V0:%.*]] = va_arg ptr [[VARARGS]], i32
|
|
; CHECK-NEXT: [[V1:%.*]] = va_arg ptr [[VARARGS]], i32
|
|
; CHECK-NEXT: [[V0_NEG:%.*]] = sub i32 0, [[V0]]
|
|
; CHECK-NEXT: [[SUB:%.*]] = add i32 [[V0_NEG]], 1
|
|
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[V1]]
|
|
; CHECK-NEXT: call void @llvm.va_end(ptr [[VARARGS]])
|
|
; CHECK-NEXT: ret i32 [[ADD]]
|
|
;
|
|
%varargs = alloca ptr, align 8
|
|
call void @llvm.va_start(ptr %varargs)
|
|
%v0 = va_arg ptr %varargs, i32
|
|
%v1 = va_arg ptr %varargs, i32
|
|
%sub = sub nsw i32 %v1, %v0
|
|
%add = add nsw i32 %sub, 1
|
|
call void @llvm.va_end(ptr %varargs)
|
|
ret i32 %add
|
|
}
|
|
|
|
declare void @llvm.va_start(ptr)
|
|
declare void @llvm.va_end(ptr)
|