107 lines · plain
1; RUN: llc < %s -asm-verbose=false -fast-isel -fast-isel-abort=1 -verify-machineinstrs | FileCheck %s2 3target triple = "wasm32-unknown-unknown"4 5; FastISel should not fold one of the add/sub operands into a load/store's6; offset when 'nuw' (no unsigned wrap) is not present, because the address7; calculation does not wrap. When there is an add/sub and nuw is not present, we8; bail out of FastISel.9 10@mylabel = external global ptr11 12; CHECK-LABEL: dont_fold_non_nuw_add_load:13; CHECK: local.get 014; CHECK-NEXT: i32.const 214748364415; CHECK-NEXT: i32.add16; CHECK-NEXT: i32.load 017define i32 @dont_fold_non_nuw_add_load(ptr %p) {18 %q = ptrtoint ptr %p to i3219 %r = add i32 %q, 214748364420 %s = inttoptr i32 %r to ptr21 %t = load i32, ptr %s22 ret i32 %t23}24 25; CHECK-LABEL: dont_fold_non_nuw_add_store:26; CHECK: local.get 027; CHECK-NEXT: i32.const 214748364428; CHECK-NEXT: i32.add29; CHECK-NEXT: i32.const 530; CHECK-NEXT: i32.store 031define void @dont_fold_non_nuw_add_store(ptr %p) {32 %q = ptrtoint ptr %p to i3233 %r = add i32 %q, 214748364434 %s = inttoptr i32 %r to ptr35 store i32 5, ptr %s36 ret void37}38 39; CHECK-LABEL: dont_fold_non_nuw_add_load_2:40; CHECK: i32.const mylabel41; CHECK-NEXT: i32.const -442; CHECK-NEXT: i32.add43; CHECK-NEXT: i32.load 044define i32 @dont_fold_non_nuw_add_load_2() {45 %t = load i32, ptr inttoptr (i32 add (i32 ptrtoint (ptr @mylabel to i32), i32 -4) to ptr), align 446 ret i32 %t47}48 49; CHECK-LABEL: dont_fold_non_nuw_add_store_2:50; CHECK: i32.const mylabel51; CHECK-NEXT: i32.const -452; CHECK-NEXT: i32.add53; CHECK-NEXT: i32.const 554; CHECK-NEXT: i32.store 055define void @dont_fold_non_nuw_add_store_2() {56 store i32 5, ptr inttoptr (i32 add (i32 ptrtoint (ptr @mylabel to i32), i32 -4) to ptr), align 457 ret void58}59 60; CHECK-LABEL: dont_fold_non_nuw_sub_load:61; CHECK: local.get 062; CHECK-NEXT: i32.const -214748364463; CHECK-NEXT: i32.sub64; CHECK-NEXT: i32.load 065define i32 @dont_fold_non_nuw_sub_load(ptr %p) {66 %q = ptrtoint ptr %p to i3267 %r = sub i32 %q, -214748364468 %s = inttoptr i32 %r to ptr69 %t = load i32, ptr %s70 ret i32 %t71}72 73; CHECK-LABEL: dont_fold_non_nuw_sub_store:74; CHECK: local.get 075; CHECK-NEXT: i32.const -214748364476; CHECK-NEXT: i32.sub77; CHECK-NEXT: i32.const 578; CHECK-NEXT: i32.store 079define void @dont_fold_non_nuw_sub_store(ptr %p) {80 %q = ptrtoint ptr %p to i3281 %r = sub i32 %q, -214748364482 %s = inttoptr i32 %r to ptr83 store i32 5, ptr %s84 ret void85}86 87; CHECK-LABEL: dont_fold_non_nuw_sub_load_2:88; CHECK: i32.const mylabel89; CHECK-NEXT: i32.const 490; CHECK-NEXT: i32.sub91; CHECK-NEXT: i32.load 092define i32 @dont_fold_non_nuw_sub_load_2() {93 %t = load i32, ptr inttoptr (i32 sub (i32 ptrtoint (ptr @mylabel to i32), i32 4) to ptr), align 494 ret i32 %t95}96 97; CHECK-LABEL: dont_fold_non_nuw_sub_store_2:98; CHECK: i32.const mylabel99; CHECK-NEXT: i32.const 4100; CHECK-NEXT: i32.sub101; CHECK-NEXT: i32.const 5102; CHECK-NEXT: i32.store 0103define void @dont_fold_non_nuw_sub_store_2() {104 store i32 5, ptr inttoptr (i32 sub (i32 ptrtoint (ptr @mylabel to i32), i32 4) to ptr), align 4105 ret void106}107