Fix the interpreter to not crash due to zeroext/signext
authorNick Lewycky <nicholas@mxc.ca>
Sun, 8 Nov 2009 00:45:29 +0000 (00:45 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 8 Nov 2009 00:45:29 +0000 (00:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86428 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Interpreter/Execution.cpp
test/ExecutionEngine/interpreter-ext.ll [new file with mode: 0644]

index 01bd2c7f89931e004b39f98721ba855990ca6e56..b59cfd162f941246169e2c165191453842d5e064 100644 (file)
@@ -882,16 +882,6 @@ void Interpreter::visitCallSite(CallSite CS) {
          e = SF.Caller.arg_end(); i != e; ++i, ++pNum) {
     Value *V = *i;
     ArgVals.push_back(getOperandValue(V, SF));
-    // Promote all integral types whose size is < sizeof(i32) into i32.
-    // We do this by zero or sign extending the value as appropriate
-    // according to the parameter attributes
-    const Type *Ty = V->getType();
-    if (Ty->isInteger() && (ArgVals.back().IntVal.getBitWidth() < 32)) {
-      if (CS.paramHasAttr(pNum, Attribute::ZExt))
-        ArgVals.back().IntVal = ArgVals.back().IntVal.zext(32);
-      else if (CS.paramHasAttr(pNum, Attribute::SExt))
-        ArgVals.back().IntVal = ArgVals.back().IntVal.sext(32);
-    }
   }
 
   // To handle indirect calls, we must get the pointer value from the argument
diff --git a/test/ExecutionEngine/interpreter-ext.ll b/test/ExecutionEngine/interpreter-ext.ll
new file mode 100644 (file)
index 0000000..4aef45a
--- /dev/null
@@ -0,0 +1,19 @@
+; RUN: lli -force-interpreter
+; Extending a value due to zeroext/signext will leave it the wrong size
+; causing problems later, such as a crash if you try to extend it again.
+
+define void @zero(i8 zeroext %foo) {
+  zext i8 %foo to i32
+  ret void
+}
+
+define void @sign(i8 signext %foo) {
+  sext i8 %foo to i32
+  ret void
+}
+
+define i32 @main() {
+  call void @zero(i8 0)
+  call void @sign(i8 0)
+  ret i32 0
+}