
Remove support for the mul constant expression, which has previously already been marked as undesirable. This removes the APIs to create mul expressions and updates tests to stop using mul expressions. Part of: https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179
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)
|
|
}
|