cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
402 lines
10 KiB
LLVM
402 lines
10 KiB
LLVM
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
|
; RUN: verify-uselistorder %s
|
|
|
|
@addr = external global i64
|
|
@addr_as1 = external addrspace(1) global i64
|
|
|
|
define i64 @add_unsigned(i64 %x, i64 %y) {
|
|
; CHECK: %z = add nuw i64 %x, %y
|
|
%z = add nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sub_unsigned(i64 %x, i64 %y) {
|
|
; CHECK: %z = sub nuw i64 %x, %y
|
|
%z = sub nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @mul_unsigned(i64 %x, i64 %y) {
|
|
; CHECK: %z = mul nuw i64 %x, %y
|
|
%z = mul nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @add_signed(i64 %x, i64 %y) {
|
|
; CHECK: %z = add nsw i64 %x, %y
|
|
%z = add nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sub_signed(i64 %x, i64 %y) {
|
|
; CHECK: %z = sub nsw i64 %x, %y
|
|
%z = sub nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @mul_signed(i64 %x, i64 %y) {
|
|
; CHECK: %z = mul nsw i64 %x, %y
|
|
%z = mul nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @add_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = add i64 %x, %y
|
|
%z = add i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sub_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = sub i64 %x, %y
|
|
%z = sub i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @mul_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = mul i64 %x, %y
|
|
%z = mul i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @add_both(i64 %x, i64 %y) {
|
|
; CHECK: %z = add nuw nsw i64 %x, %y
|
|
%z = add nuw nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sub_both(i64 %x, i64 %y) {
|
|
; CHECK: %z = sub nuw nsw i64 %x, %y
|
|
%z = sub nuw nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @mul_both(i64 %x, i64 %y) {
|
|
; CHECK: %z = mul nuw nsw i64 %x, %y
|
|
%z = mul nuw nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @add_both_reversed(i64 %x, i64 %y) {
|
|
; CHECK: %z = add nuw nsw i64 %x, %y
|
|
%z = add nsw nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sub_both_reversed(i64 %x, i64 %y) {
|
|
; CHECK: %z = sub nuw nsw i64 %x, %y
|
|
%z = sub nsw nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @mul_both_reversed(i64 %x, i64 %y) {
|
|
; CHECK: %z = mul nuw nsw i64 %x, %y
|
|
%z = mul nsw nuw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @shl_both(i64 %x, i64 %y) {
|
|
; CHECK: %z = shl nuw nsw i64 %x, %y
|
|
%z = shl nuw nsw i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sdiv_exact(i64 %x, i64 %y) {
|
|
; CHECK: %z = sdiv exact i64 %x, %y
|
|
%z = sdiv exact i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @sdiv_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = sdiv i64 %x, %y
|
|
%z = sdiv i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @udiv_exact(i64 %x, i64 %y) {
|
|
; CHECK: %z = udiv exact i64 %x, %y
|
|
%z = udiv exact i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @udiv_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = udiv i64 %x, %y
|
|
%z = udiv i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @ashr_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = ashr i64 %x, %y
|
|
%z = ashr i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @ashr_exact(i64 %x, i64 %y) {
|
|
; CHECK: %z = ashr exact i64 %x, %y
|
|
%z = ashr exact i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @lshr_plain(i64 %x, i64 %y) {
|
|
; CHECK: %z = lshr i64 %x, %y
|
|
%z = lshr i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define i64 @lshr_exact(i64 %x, i64 %y) {
|
|
; CHECK: %z = lshr exact i64 %x, %y
|
|
%z = lshr exact i64 %x, %y
|
|
ret i64 %z
|
|
}
|
|
|
|
define ptr @gep_nw(ptr %p, i64 %x) {
|
|
; CHECK: %z = getelementptr inbounds i64, ptr %p, i64 %x
|
|
%z = getelementptr inbounds i64, ptr %p, i64 %x
|
|
ret ptr %z
|
|
}
|
|
|
|
define ptr @gep_plain(ptr %p, i64 %x) {
|
|
; CHECK: %z = getelementptr i64, ptr %p, i64 %x
|
|
%z = getelementptr i64, ptr %p, i64 %x
|
|
ret ptr %z
|
|
}
|
|
|
|
define i64 @add_both_ce() {
|
|
; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @sub_both_ce() {
|
|
; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define ptr @gep_nw_ce() {
|
|
; CHECK: ret ptr getelementptr inbounds (i64, ptr @addr, i64 171)
|
|
ret ptr getelementptr inbounds (i64, ptr @addr, i64 171)
|
|
}
|
|
|
|
define i64 @add_plain_ce() {
|
|
; CHECK: ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @sub_plain_ce() {
|
|
; CHECK: ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define ptr @gep_plain_ce() {
|
|
; CHECK: ret ptr getelementptr (i64, ptr @addr, i64 171)
|
|
ret ptr getelementptr (i64, ptr @addr, i64 171)
|
|
}
|
|
|
|
define i64 @add_both_reversed_ce() {
|
|
; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @sub_both_reversed_ce() {
|
|
; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @add_signed_ce() {
|
|
; CHECK: ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @sub_signed_ce() {
|
|
; CHECK: ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @add_unsigned_ce() {
|
|
; CHECK: ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @sub_unsigned_ce() {
|
|
; CHECK: ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
|
|
}
|
|
|
|
define i64 @test_zext(i32 %a) {
|
|
; CHECK: %res = zext nneg i32 %a to i64
|
|
%res = zext nneg i32 %a to i64
|
|
ret i64 %res
|
|
}
|
|
|
|
define float @test_uitofp(i32 %a) {
|
|
; CHECK: %res = uitofp nneg i32 %a to float
|
|
%res = uitofp nneg i32 %a to float
|
|
ret float %res
|
|
}
|
|
|
|
|
|
define i64 @test_or(i64 %a, i64 %b) {
|
|
; CHECK: %res = or disjoint i64 %a, %b
|
|
%res = or disjoint i64 %a, %b
|
|
ret i64 %res
|
|
}
|
|
|
|
define i32 @test_trunc_signed(i64 %a) {
|
|
; CHECK: %res = trunc nsw i64 %a to i32
|
|
%res = trunc nsw i64 %a to i32
|
|
ret i32 %res
|
|
}
|
|
|
|
define i32 @test_trunc_unsigned(i64 %a) {
|
|
; CHECK: %res = trunc nuw i64 %a to i32
|
|
%res = trunc nuw i64 %a to i32
|
|
ret i32 %res
|
|
}
|
|
|
|
define i32 @test_trunc_both(i64 %a) {
|
|
; CHECK: %res = trunc nuw nsw i64 %a to i32
|
|
%res = trunc nuw nsw i64 %a to i32
|
|
ret i32 %res
|
|
}
|
|
|
|
define i32 @test_trunc_both_reversed(i64 %a) {
|
|
; CHECK: %res = trunc nuw nsw i64 %a to i32
|
|
%res = trunc nsw nuw i64 %a to i32
|
|
ret i32 %res
|
|
}
|
|
|
|
define <2 x i32> @test_trunc_signed_vector(<2 x i64> %a) {
|
|
; CHECK: %res = trunc nsw <2 x i64> %a to <2 x i32>
|
|
%res = trunc nsw <2 x i64> %a to <2 x i32>
|
|
ret <2 x i32> %res
|
|
}
|
|
|
|
define <2 x i32> @test_trunc_unsigned_vector(<2 x i64> %a) {
|
|
; CHECK: %res = trunc nuw <2 x i64> %a to <2 x i32>
|
|
%res = trunc nuw <2 x i64> %a to <2 x i32>
|
|
ret <2 x i32> %res
|
|
}
|
|
|
|
define <2 x i32> @test_trunc_both_vector(<2 x i64> %a) {
|
|
; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32>
|
|
%res = trunc nuw nsw <2 x i64> %a to <2 x i32>
|
|
ret <2 x i32> %res
|
|
}
|
|
|
|
define <2 x i32> @test_trunc_both_reversed_vector(<2 x i64> %a) {
|
|
; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32>
|
|
%res = trunc nsw nuw <2 x i64> %a to <2 x i32>
|
|
ret <2 x i32> %res
|
|
}
|
|
|
|
define i1 @test_icmp_samesign(i32 %a, i32 %b) {
|
|
; CHECK: %res = icmp samesign ult i32 %a, %b
|
|
%res = icmp samesign ult i32 %a, %b
|
|
ret i1 %res
|
|
}
|
|
|
|
define <2 x i1> @test_icmp_samesign2(<2 x i32> %a, <2 x i32> %b) {
|
|
; CHECK: %res = icmp samesign ult <2 x i32> %a, %b
|
|
%res = icmp samesign ult <2 x i32> %a, %b
|
|
ret <2 x i1> %res
|
|
}
|
|
|
|
define ptr @gep_nuw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr nuw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr nuw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr @gep_inbounds_nuw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr @gep_nusw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr nusw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr nusw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
; inbounds implies nusw, so the flag is not printed back.
|
|
define ptr @gep_inbounds_nusw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr inbounds i8, ptr %p, i64 %idx
|
|
%gep = getelementptr inbounds nusw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr @gep_nusw_nuw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr nusw nuw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr nusw nuw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr @gep_inbounds_nusw_nuw(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr inbounds nusw nuw i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr @gep_nuw_nusw_inbounds(ptr %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
|
|
%gep = getelementptr nuw nusw inbounds i8, ptr %p, i64 %idx
|
|
ret ptr %gep
|
|
}
|
|
|
|
define ptr addrspace(1) @gep_nusw_nuw_as1(ptr addrspace(1) %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx
|
|
%gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx
|
|
ret ptr addrspace(1) %gep
|
|
}
|
|
|
|
define <2 x ptr> @gep_nusw_nuw_vec(<2 x ptr> %p, i64 %idx) {
|
|
; CHECK: %gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx
|
|
%gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx
|
|
ret <2 x ptr> %gep
|
|
}
|
|
|
|
define ptr @const_gep_nuw() {
|
|
; CHECK: ret ptr getelementptr nuw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr nuw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_inbounds_nuw() {
|
|
; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_nusw() {
|
|
; CHECK: ret ptr getelementptr nusw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr nusw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
; inbounds implies nusw, so the flag is not printed back.
|
|
define ptr @const_gep_inbounds_nusw() {
|
|
; CHECK: ret ptr getelementptr inbounds (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr inbounds nusw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_nusw_nuw() {
|
|
; CHECK: ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_inbounds_nusw_nuw() {
|
|
; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr inbounds nusw nuw (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_nuw_nusw_inbounds() {
|
|
; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr nuw nusw inbounds (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr @const_gep_nuw_inrange() {
|
|
; CHECK: ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100)
|
|
ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100)
|
|
}
|
|
|
|
define ptr addrspace(1) @const_gep_nusw_nuw_as1() {
|
|
; CHECK: ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100)
|
|
ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100)
|
|
}
|